4

ハードディスクから画像ファイルを開く画像がwpfページにあります。イメージを定義するためのXAMLは次のとおりです。

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

Caliburn Microを使用していますが、ImageFileNameが、イメージコントロールに表示されるファイルの名前で更新されています。

画像制御で画像を開く場合、ファイルを変更する必要があります。しかし、ファイルは画像制御によってロックされており、その上にあるメイジを削除またはコピーすることはできません。Imageを開いた後、または別のファイルをコピーする必要があるときに、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 に答える