TL;DR
- ListViewでとあるフォルダ内の画像一覧を表示しようとした
- WPFのImageのSourceにBindingで画像そのもののパスを与えた
- 表示を終わった時点で使った画像を削除したかったけど、削除できなかった
- 画像のパスじゃなくて、BitmapImageを与えるようにしたら解決
環境
Windows 10
Visual Studio 2017
最初
MainWindow.xaml
<Image Margin="10,20,10,20" Source="{Binding ImgPath}" />
MainWindowViewModel.cs
public class ThumbnailImage : BindableBase, IThumbnailImage
{
private string_imgPath;
public string ImgPath
{
get { return this._imgPath; }
set { SetProperty(ref this._imgPath, value); }
}
public ThumbnailImage(string filePath) {
this.ImgPath = filePath;
}
}
最終
MainWindow2.xaml
<Image Margin="10,20,10,20" Source="{Binding ImgPath}" />
cs:MainWindowViewModel2.cs
public class ThumbnailImage : BindableBase, IThumbnailImage
{
private BitmapImage _imgPath;
public BitmapImage ImgPath
{
get { return this._imgPath; }
set { SetProperty(ref this._imgPath, value); }
}
public ThumbnailImage(string filePath) {
this.ImgPath = CreateBitmapImage(filePath);
}
public static BitmapImage CreateBitmapImage(string filePath)
{
BitmapImage img = new BitmapImage();
img.BeginInit();
img.CacheOption = BitmapCacheOption.OnLoad; // ←ここが重要
img.UriSource = new System.Uri(filePath);
img.EndInit();
return img;
}
}
CacheOption
をBitmapCacheOption.OnLoad
にすると、読み込み後に画像ファイルを占有しなくなるそうです。