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"); 
  • Как правильно привязать xml к WPF DataGrid?
  • Есть ли способ определить, где объявляется / создается привязка WPF?
  • WPF привязка к локальной переменной
  • Должен ли я привязываться к ICollectionView или ObservableCollection
  • Обход проблемы из-за отсутствия оператора 'nameof' в C # для безопасного хранения данных по типу?
  • Что означает «{Binding Path =.}» В привязке WPF?
  • Какие подходы доступны для фиктивных данных времени разработки в WPF?
  • Связывающие свойства в коде
  • Привязка данных Android с использованием тега include
  • Привязка OneWayToSource от свойства readonly в XAML
  • Для чего нужен DataContext?
  • Давайте будем гением компьютера.