2015-02-02 3 views
0

У меня есть изображение WPF, источником которого является локальный URI на моем жестком диске, и я использую конвертер для его загрузки.WPF Изменение пути к изображению и отображение нового изображения в Runtime

Я хочу, чтобы изменить изображение на жестком диске (заменить его другим) и выполнения показать новое изображение

Здесь XAML изображения

<Image Stretch="Fill"> 
              <Image.Style> 
               <Style TargetType="Image"> 
                <Setter Property="Source" Value="{Binding ImagePath,Converter={StaticResource ImageFileLoader},UpdateSourceTrigger=PropertyChanged}"/> 
               </Style> 
              </Image.Style> 
             </Image> 

Вот преобразователь

class ImageFileLoader : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value != null) 
     { 
      string filePath = value.ToString(); 
      if (File.Exists(filePath)) 
      { 
       BitmapImage result = new BitmapImage(); 
       result.BeginInit(); 
       result.UriSource = new Uri(filePath); 
       result.CacheOption = BitmapCacheOption.OnLoad; 
       result.EndInit(); 
       return result; 
      } 

     } 

     return null; 
    } 

}

Примечание: Я попытался изменить CacheOption в преобразователе для BitmapCacheOption.None или любой другой вариант ... это did't работу, потому что в этом случае я не могу изменить изображение на жестком диске

+0

@Clemens нет не реализует его, однако реагируют на событие стрельбы PropertyChanged, когда свойство ImagePath изменилось. –

+0

Извините, я неправильно понял ваш XAML. Это не класс ImageFileLoader, который должен был бы реализовать INotifyPropertyChanged, но класс, объявляющий свойство ImagePath. Вы должны, возможно, разместить соответствующие части этого кода. – Clemens

+0

Да, класс модели, содержащий свойство «ImagePath», реализует интерфейс INotifyPropertyChanged ... и это простой класс, который вы можете себе представить, как будто у него есть свойство ImagePath. –

ответ

2

Когда Framework загружает Image , это вызывает раздражающее удержание на нем, так что если вы попытаетесь удалить или переместить фактический файл изображения, вы получите Exception, говорящее что-то вроде Невозможно получить доступ к файлу, так как он используется. Чтобы обойти это, я создал IValueConverter как ваш, чтобы установить Image.CacheOption на BitmapCacheOption.OnLoad, который кэширует все изображение в память при загрузке, тем самым снимая трюм.

Однако код в моем конверторе похож на ваш, поэтому я не уверен, почему он не сработает для вас. Вот что мой IValueConverter код выглядит как:

using (FileStream stream = File.OpenRead(filePath)) 
{ 
    image.BeginInit(); 
    image.StreamSource = stream; 
    image.CacheOption = BitmapCacheOption.OnLoad; 
    image.EndInit(); 
} 
+0

Спасибо за ваш ответ Моя проблема НЕ в том, что Я не могу изменить файл изображения вручную, я могу изменить файл (переименовать его или даже удалить) Основная проблема заключается в том, что изменения не отображаются в пользовательском интерфейсе –

+2

Убедитесь, что вы внедрили 'INotifyPropertyChangedInterface' на ваше свойство ImagePath. Если это не поможет, вам также может потребоваться сначала установить свойство пути к пустой строке (очистить старый путь), а затем установить новое значение. – Sheridan

+0

спасибо ... вся проблема была некорректным значением, установленным на imagPath –