Image UriSource и привязка данных

Я пытаюсь связать список пользовательских объектов с изображением WPF следующим образом:

     

Но это не сработает. Это ошибка, которую я получаю:

«Свойство« UriSource »или свойство« StreamSource »должны быть установлены».

Что мне не хватает?

WPF имеет встроенные преобразователи для определенных типов. Если вы привязываете свойство Source Image к string или значению Uri , под капотом WPF будет использовать ImageSourceConverter для преобразования значения в ImageSource .

Так

  

будет работать, если свойство ImageSource представляет собой строковое представление допустимого URI для изображения.

Вы можете, конечно, свернуть собственный конвертер привязки:

 public class ImageConverter : IValueConverter { public object Convert( object value, Type targetType, object parameter, CultureInfo culture) { return new BitmapImage(new Uri(value.ToString())); } public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture) { throw new NotSupportedException(); } } 

и используйте его так:

  

В этой статье Atul Gupta приведен пример кода, который охватывает несколько сценариев:

  1. Обычная привязка изображения ресурса к свойству Source в XAML
  2. Привязка изображения ресурса, но из кода
  3. Связывание изображения ресурса в коде с помощью Application.GetResourceStream
  4. Загрузка изображения из пути к файлу через stream памяти (то же самое применимо при загрузке данных изображения блога из базы данных)
  5. Загрузка изображения из пути к файлу, но с помощью привязки к пути к файлу Property
  6. Связывание данных изображения с пользовательским элементом управления, который внутренне имеет управление изображением через свойство зависимостей
  7. То же, что и в пункте 5, но также гарантирует, что файл не будет заблокирован на жестком диске

Вы также можете просто установить атрибут Source, а не использовать дочерние элементы. Для этого вашему classу необходимо вернуть изображение в виде растрового изображения. Вот пример того, как я это сделал

  

И свойство classа просто это

 public object ImageSource { get { BitmapImage image = new BitmapImage(); try { image.BeginInit(); image.CacheOption = BitmapCacheOption.OnLoad; image.CreateOptions = BitmapCreateOptions.IgnoreImageCache; image.UriSource = new Uri( FullPath, UriKind.Absolute ); image.EndInit(); } catch{ return DependencyProperty.UnsetValue; } return image; } } 

Я полагаю, что это может быть немного больше, чем конвертер значений, но это еще один вариант.

Вам необходимо реализовать интерфейс IValueConverter, который преобразует uri в изображение. Ваша конвертируемая реализация IValueConverter будет выглядеть примерно так:

 BitmapImage image = new BitmapImage(); image.BeginInit(); image.UriSource = new Uri(value as string); image.EndInit(); return image; 

Затем вам нужно будет использовать конвертер в вашей привязке:

      

Проблема с ответом, который был выбран здесь, заключается в том, что при навигации взад и вперед конвертер будет запускаться каждый раз, когда отображается страница.

Это приводит к тому, что новые дескрипторы файлов создаются непрерывно и блокирует любую попытку удалить файл, поскольку он все еще используется. Это можно проверить с помощью Process Explorer.

Если файл изображения может быть удален в какой-то момент, может быть использован такой конвертер: использование XAML для привязки к System.Drawing.Image в элемент управления System.Windows.Image

Недостатком этого метода streamа памяти является то, что изображение (изображения) загружается и декодируется каждый раз, и не может выполняться кеширование: «Чтобы предотвратить декодирование изображений более одного раза, назначьте свойство Image.Source из Uri, а не используя streamи памяти “Источник:« Рекомендации по производительности для приложений Windows Store с использованием XAML »

Чтобы решить проблему с производительностью, шаблон репозитория можно использовать для обеспечения уровня кэширования. Кэширование может происходить в памяти, что может вызвать проблемы с памятью, или в виде файлов миниатюр, которые находятся во временной папке, которая может быть удалена при выходе приложения.

вы можете использовать

Класс ImageSourceConverter

получить то, что вы хотите

  img1.Source = (ImageSource)new ImageSourceConverter().ConvertFromString("/Assets/check.png"); 
  • Каковы различные режимы привязки WPF?
  • WPF MVVM INotifyPropertyChanged Implementation - модель или ViewModel
  • Похоже, что привязки данных не обновляются
  • Управление несколькими выборами с помощью MVVM
  • Как правильно привязать xml к WPF DataGrid?
  • Нажатие свойств GUI только для чтения обратно в ViewModel
  • Можно ли связать свойство Canvas's Children в XAML?
  • Какие подходы доступны для фиктивных данных времени разработки в WPF?
  • Привязка OneWayToSource от свойства readonly в XAML
  • Связывание в WPF с элементом массива, заданным свойством
  • Что означает «{Binding Path =.}» В привязке WPF?
  • Interesting Posts

    Почему PerThreadLifetimeManager используется в этом примере?

    Почему производительность обычного жесткого диска уменьшается в течение всего теста, в то время как SSD не работает?

    Использование внутренних classов в C #

    В чем разница между @ViewChild и @ContentChild?

    Выполнять несколько команд по ssh без повторного подключения

    Можно ли связать команды привязки ключей в возвышенном тексте 2?

    Как конвертировать цветовые коды HEX RGB в UIColor?

    Оставляя пробел ячейки в Excel до ввода данных

    Создание ключа API для открытия карты Google

    Как пропустить предварительный запрос OPTIONS в AngularJS

    Возможно ли получить доступ к текущему fragmentу, просматриваемому ViewPager?

    Анонимный экземпляр classа – это плохая идея?

    Предупреждения действительных атрибутов HTML5 в Eclipse

    Как использовать кодек без его установки (переносимый)

    Существует ли полная лицензия Windows 8 на продажу? (Не OEM, не обновление)

    Давайте будем гением компьютера.