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;
}