我认为我的问题与封闭主题有关:How can I stop <Image Source="file path"/> process?。那个话题已经结束了,答案对我来说并不适用。
我的问题是,我无法使用File.Delete(路径)。它提供例外:&#34;附加信息:该过程无法访问文件&#39; C:\ Images \ 2014_09 \ auto_12_53_55_beszelri_modified.jpg&#39;因为它正被另一个进程使用&#34;。
我试图在Window_OnClosed事件中调用此方法。我的想法是,当我关闭窗口时,我必须删除图像的jpg文件。此文件的路径是WPF中图像控件的来源。在调用该方法之前,我尝试将Image source设置为null,但它不起作用。如何在关闭窗口之后或期间删除该文件。当我尝试在那个地方关闭其他文件时,它是成功的。
这是已结束事件的代码。 CreateFileString方法创建路径。
private void ImageWindow_OnClosed(object sender, EventArgs e)
{
var c = CarImage.Source.ToString();
var a = CreateFileString(c);
CarImage.Source = null;
File.Delete(a);
}
答案 0 :(得分:1)
出于某些恼人的原因,WPF中的标记解析器打开图像并保持与物理文件的连接打开。我在允许用户切换图像方面遇到了类似的问题。我解决这个问题的方法是使用IValueConverter
加载Image
并将BitmapImage.CacheOption
设置为BitmapCacheOption.OnLoad
。试试这个:
public class FilePathToImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value.GetType() != typeof(string) || targetType != typeof(ImageSource)) return false;
string filePath = value as string;
if (filePath.IsNullOrEmpty() || !File.Exists(filePath)) return DependencyProperty.UnsetValue;
BitmapImage image = new BitmapImage();
try
{
using (FileStream stream = File.OpenRead(filePath))
{
image.BeginInit();
image.StreamSource = stream;
image.CacheOption = BitmapCacheOption.OnLoad;
image.EndInit();
}
}
catch { return DependencyProperty.UnsetValue; }
return image;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return DependencyProperty.UnsetValue;
}
}
你可以像这样使用它:
<Application.Resources>
<Converters:FilePathToImageConverter x:Key="FilePathToImageConverter" />
</Application.Resources>
...
<Image Source="{Binding SomeObject.SomeImageFilePath,
Converter={StaticResource FilePathToImageConverter}, Mode=OneWay}" />