4

我的 wpf 页面上有一个图像,它从硬盘打开一个图像文件。用于定义图像的 XAML 是:

  <Image  Canvas.Left="65" Canvas.Top="5" Width="510" Height="255" Source="{Binding Path=ImageFileName}"  />

我正在使用 Caliburn Micro,并且 ImageFileName 更新为图像控件应显示的文件名。

当图像被图像控件打开时,我需要更改文件。但是该文件被图像控制锁定,我无法删除或复制任何法师。如何强制 Image 在打开文件后关闭文件,或者当我需要在其上复制另一个文件时?

我检查并没有用于图像的 CashOptio,所以我不能使用它。

4

1 回答 1

10

您可以使用如下所示的绑定转换器,通过设置BitmapCacheOption.OnLoad将图像直接加载到内存缓存。该文件会立即加载,之后不会锁定。

<Image Source="{Binding ...,
                Converter={StaticResource local:StringToImageConverter}}"/>

转换器:

public class StringToImageConverter : IValueConverter
{
    public object Convert(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        object result = null;
        var path = value as string;

        if (!string.IsNullOrEmpty(path))
        {
            var image = new BitmapImage();
            image.BeginInit();
            image.CacheOption = BitmapCacheOption.OnLoad;
            image.UriSource = new Uri(path);
            image.EndInit();
            result = image;
        }

        return result;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

更好的是,直接从 FileStream 加载 BitmapImage:

public object Convert(
    object value, Type targetType, object parameter, CultureInfo culture)
{
    object result = null;
    var path = value as string;

    if (!string.IsNullOrEmpty(path) && File.Exists(path))
    {
        using (var stream = File.OpenRead(path))
        {
            var image = new BitmapImage();
            image.BeginInit();
            image.CacheOption = BitmapCacheOption.OnLoad;
            image.StreamSource = stream;
            image.EndInit();
            result = image;
        }
    }

    return result;
}
于 2012-10-12T21:21:56.773 回答