0

我认为我的问题与已关闭的主题有关:如何停止 <Image Source="file path"/> 进程?. 该主题已关闭,它的答案对我不起作用。

我的问题是事实,我不能使用 File.Delete(path)。它提供了异常:“附加信息:该进程无法访问文件 'C:\Images\2014_09\auto_12_53_55_beszelri_modified.jpg',因为它正被另一个进程使用”。

我正在尝试在 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);
}
4

1 回答 1

1

由于某些烦人的原因,WPF 中的标记解析器会打开图像并保持与物理文件的连接处于打开状态。我在允许用户切换图像时遇到了类似的问题。我解决它的方法是使用IValueConverter加载Image并将 设置BitmapImage.CacheOptionBitmapCacheOption.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}" />
于 2014-09-24T13:39:57.180 回答