J'écris une application WPF Image Manager. J'ai un ListBox avec le ItemsTemplate suivant:Supprimer une image liée à un contrôle
<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 « d'image » est liée à la propriété « FullName », qui est une chaîne représentant le chemin absolu à un JPG.
Plusieurs fonctionnalités de l'application nécessitent que je modifie le fichier JPG (déplacer, renommer ou supprimer). Lorsque j'essaie de le faire (en essayant actuellement de déplacer le fichier), je reçois une exception d'E/S: "Le processus ne peut pas accéder au fichier parce qu'il est utilisé par un autre processus." Le processus de verrouillage du fichier est mon application WPF.
J'ai fait quelques recherches en ligne et trouvé plusieurs messages indiquant que les images en particulier ont du mal à abandonner leurs ressources. Je l'ai essayé ce qui suit:
- Réglage de la ListBox.Source à null
- Ajout de 10 secondes le temps d'attente avant de tenter le déménagement.
- Emission 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 ItemsTemplate et essayer de disposer de l'Image, mais je n'arrive pas à comprendre comment obtenir la référence. Une solution possible que j'ai lu à propos de était de créer des copies des images plutôt que les images réelles, mais depuis la liaison est au nom de fichier et non l'image réelle, je ne sais pas si je pouvais faire ce travail.
Toute aide ou suggestion serait grandement appréciée.
J'ai essayé ceci (sans DecodePixelWidth/Height), mais le fichier est toujours verrouillé. Il doit y avoir quelque chose d'autre - je vais devoir commencer à chercher d'autres problèmes. Un objet FileInfo créerait-il un verrou? –
Je pense que vous devrez éliminer les causes potentielles une par une. –
J'ai épuisé tout ce que je pouvais trouver. Je vais reconstruire l'application suivante, en vérifiant étape par étape pour le coupable. –