J'écris une application WPF de gestion d'images. J'ai une ListBox avec le ItemsTemplate suivant :
<Grid x:Name="grid" Width="150" Height="150" Background="{x:Null}">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="27.45"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150"/>
</Grid.ColumnDefinitions>
<Border Margin="5,5,5,5.745" Grid.RowSpan="2" Background="#FF828282" BorderBrush="{DynamicResource ListBorder}" CornerRadius="5,5,5,5" BorderThickness="1,1,2,2" x:Name="border">
<Grid>
<Viewbox Margin="0,0,0,21.705">
<Image Width="Auto" Height="Auto" x:Name="picture" Source="{Binding Path=FullName}" />
</Viewbox>
<TextBlock Height="Auto" Text="{Binding Path=Name}" TextWrapping="Wrap" x:Name="PictureText" HorizontalAlignment="Left" Margin="70,0,0,0" VerticalAlignment="Bottom" />
</Grid>
</Border>
</Grid>
Notez que le contrôle "Image" est lié à la propriété "FullName", qui est une chaîne représentant le chemin d'accès absolu à un fichier JPG.
Plusieurs fonctions de l'application exigent que je modifie le fichier JPG (en le déplaçant, en le renommant ou en le supprimant). Lorsque j'essaie de le faire (j'essaie actuellement de déplacer le fichier), je reçois une exception IOException : "Le processus ne peut pas accéder au fichier car il est utilisé par un autre processus". Le processus qui verrouille le fichier est mon application WPF.
J'ai fait quelques recherches en ligne et j'ai trouvé plusieurs messages indiquant que les images en particulier ont du mal à se débarrasser de leurs ressources. J'ai essayé ce qui suit :
- Définition de ListBox.Source à null
- Ajout d'un temps d'attente de 10 secondes avant de tenter le déplacement.
- Émission de GC.Collect().
- Déplacement de l'opération vers un autre thread.
Que puis-je essayer d'autre ? J'ai pensé à trouver une référence à l'objet Image dans le modèle ItemsTemplate et à essayer de disposer de l'image, mais je n'arrive pas à trouver comment obtenir la référence.
Une solution possible que j'ai lue consistait à créer des copies des images plutôt que les images elles-mêmes, mais comme la liaison est faite avec le nom du fichier et non avec l'image elle-même, je ne sais pas si je pourrais faire fonctionner cette solution.
Toute aide ou suggestion serait très appréciée.