我有一个幻灯片应用程序显示一些图像。我有一个显示图像的简单用户控件。我从XMl文件中读取图像,每次我在新的usercontrol上创建一个新实例并在我的应用程序中显示它。在某些时候我需要“刷新”图像(例如新版本)我从应用程序中删除所有用户控件并“空”它们 - 然后我尝试删除光盘上的所有图像。但是,这给了我一个例外,即资源“myimage.png”正由另一个进程使用,无法删除。我需要做些什么才能“释放”我的资源,以便我可以删除它们?
欢呼声,
答案 0 :(得分:2)
我使用.NET Refector查看了WPF源代码,发现this answer to a related question可能是更好的解决方案。将BitmapImage.CacheOption设置为BitmapCacheOption.OnLoad将图像数据强制插入内存并立即关闭文件。
使用该选项,您可以随时删除文件系统。
答案 1 :(得分:1)
我遇到了类似的问题 - 我需要使用图像的临时文件提供图像预览。预览关闭后,我想删除该文件。
我使用显式流而不是URI来加载图像:
BitmapImage imageSource = new BitmapImage();
FileStream imageStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete);
imageSource.BeginInit();
imageSource.StreamSource = imageStream;
imageSource.EndInit();
// imagePreview is a WPF Image
imagePreview.Source = imageSource;
然后,当关闭UI并释放图像时,我明确关闭了流:
BitmapImage imageSource = imagePreview.Source as BitmapImage;
imagePreview.Source = null;
if (null != imageSource)
{
System.IO.Stream stream = imageSource.StreamSource;
imageSource.StreamSource = null;
if (null != stream)
{
stream.Close();
}
// now the file can be deleted
File.Delete(filePath);
}
答案 2 :(得分:0)
我使用显式流而不是URI来加载图像:
BitmapImage imageSource = new BitmapImage();
FileStream imageStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete);
imageSource.BeginInit();
imageSource.StreamSource = imageStream;
imageSource.EndInit();
// imagePreview is a WPF Image
imagePreview.Source = imageSource;
然后,当关闭UI并释放图像时,我明确关闭了流:
BitmapImage imageSource = imagePreview.Source as BitmapImage;
imagePreview.Source = null;
if (null != imageSource)
{
System.IO.Stream stream = imageSource.StreamSource;
imageSource.StreamSource = null;
if (null != stream)
{
stream.Close();
}
// now the file can be deleted
File.Delete(filePath);
}
这个解决方案运行正常。感谢。