Я отметил ответ Кента как ответ, и я бы также отметил ответ Бендевея, потому что я использовал их оба в окончательном решении.
Файл был определенно заблокирован, поскольку имя файла было связано с ним, поэтому элемент управления Image открыл фактический файл для создания изображения.
Чтобы решить эту проблему, я создал конвертер значений, как предложил Бендевей, а затем использовал (большую часть) кодовую форму, предложенную Кентом, для возврата нового BitmapImage:
[ValueConversion(typeof(string), typeof(BitmapImage))]
public class PathToBitmapImage : IValueConverter
{
public static BitmapImage ConvertToImage(string path)
{
if (!File.Exists(path))
return null;
BitmapImage bitmapImage = null;
try
{
bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = new FileStream(path, FileMode.Open, FileAccess.Read);
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
bitmapImage.StreamSource.Dispose();
}
catch (IOException ioex)
{
}
return bitmapImage;
}
#region IValueConverter Members
public virtual object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null || !(value is string))
return null;
var path = value as string;
return ConvertToImage(path);
}
public virtual object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
Однако, как показывают комментарии выше, это не решило проблему. Я был в других проектах и недавно вернулся к этому, чтобы найти решение.
Я создал другой проект, который только проверял этот код, и, конечно, он работал. Это сказало мне, что в оригинальной программе было больше ошибок.
Короче говоря, Образ создавался в трех местах, которые, как я думал, были рассмотрены:
1) ImageList, теперь связанный с помощью конвертера.
2) Основное изображение, которое было привязано к свойству ImageList SelectedItem.
3) Всплывающее окно DeleteImage, которое было связано с помощью конвертера.
Оказывается, проблема была в # 2. Связываясь с SelectedItem, я по ошибке предположил, что связывался с недавно отрендеренным изображением (на основе конвертера). В действительности, объект SelectedItem фактически был именем файла. Это означало, что основное изображение снова создавалось путем прямого доступа к файлу.
Таким образом, решение заключалось в том, чтобы связать основной элемент управления Image со свойством SelectedItem и использовать конвертер.