Das Löschen eines Bildes, das von einem WPF-Steuerelement verwendet wurde
-
19-09-2019 - |
Frage
Ich möchte ein Bild zu irgendeiner Art von Kontrolle binden, ein löschen später.
path = @"c:\somePath\somePic.jpg"
FileInfo fi = new FileInfo(path);
Uri uri = new Uri(fi.FullName, UriKind.Absolute);
var img = new System.Windows.Controls.Image();
img.Source = new BitmapImage(uri);
Jetzt, nach diesem Code möchte ich die Datei löschen:
fi.Delete();
Aber ich kann das nicht tun, da das Bild jetzt verwendet wird. Zwischen Codefragment 1 en 2, was kann ich tun, um sie zu lösen?
Lösung
kopieren Sie das Bild auf Memory vor dem Image geben es sollte so aussehen
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.DecodePixelWidth = 30;
bi.StreamSource = byteStream;
bi.EndInit();
Dabei gilt ByteStream ist Kopie der Datei in Memory
diese kann nützlich sein,
Andere Tipps
Sie könnten einen MemoryStream
verwenden, sondern dass tatsächlich verschwendet Speicher, da zwei getrennte Kopien der Bitmap-Daten im RAM gehalten werden: Wenn Sie die MemoryStream
laden Sie eine Kopie zu machen, und wenn das Bitmap eine andere Kopie decodiert wird. Ein weiteres Problem bei der Verwendung MemoryStream
auf diese Weise ist, dass Sie den Cache umgehen.
Der beste Weg, dies zu tun, ist direkt aus der Datei mit BitmapCacheOptions.OnLoad zu lesen:
path = @"c:\somePath\somePic.jpg"
var source = new BitmapImage();
source.BeginInit();
source.UriSource = new Uri(path, UriKind.RelativeOrAbsolute);
source.CacheOption = BitmapCacheOption.OnLoad;
source.EndInit(); // Required for full initialization to complete at this time
var img = new System.Windows.Controls.Image { Source = source };
Diese Lösung ist effizient und einfach zu.
Hinweis: Wenn Sie tatsächlich den Cache umgehen, zum Beispiel wollen, weil das Bild Platte sein Ändern auf, sollten Sie auch festlegen CreateOption = BitmapCreateOption.IgnoreImageCache
. Aber auch in diesem Fall diese Lösung der MemoryStream
Lösung übertrifft, weil es nicht immer zwei Kopien der Bilddaten im RAM.