Member 14064604 Ответов: 2

C# WPF привязывает изображение к массиву байтов / sqlite BLOB


Я пытаюсь создать приложение "книга контактов", используя C# WPF, MVVM, SQLITE и DAPPER.
Проблема: когда я пытаюсь связать изображение контакта с элементом изображения в моем пользовательском элементе управления WPF, изображение не отображается.

Другие свойства контакта, привязанные к элементам wpf, по-видимому, работают(имя контакта, сведения и т. д.).
Массив байтов для изображения контакта инициализируется(я вручную добавил некоторые тестовые контакты и изображения в таблицу с помощью DB Browser for SQLITE), но элемент image его не отображает.


Что я делаю не так?

Что я уже пробовал:

Контактная Модель:
public class Contact
{
    public int Id { get; set; }

    public string FullName { get; set; }

    public byte[] Picture { get; set; }

    public string Information { get; set; }

    public string Phone { get; set; }

    public string WhatsApp { get; set; }

    public string Skype { get; set; }
}



код XAML:

<UserControl.Resources>
    <Converter:ByteArrayToBitmapImageConverter x:Name="binaryConverter" x:Key="byteToImageConverter"/>
</UserControl.Resources>


<Grid Margin="5"  Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="4" Grid.RowSpan="4" Background="DarkGoldenrod">
           <Image  Source="{Binding SelectedContact.Picture, Converter={StaticResource byteToImageConverter}}" />
       </Grid>


Конвертер:
public class ByteArrayToBitmapImageConverter : IValueConverter
  {
      public BitmapImage ConvertByteArrayToBitMapImage(byte[] imageByteArray)
      {
          BitmapImage img = new BitmapImage();
          using (MemoryStream memStream = new MemoryStream(imageByteArray))
          {
              img.StreamSource = memStream;
          }
          return img;
      }



      public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
      {
          BitmapImage img = new BitmapImage();
          if (value != null)
          {
              img = this.ConvertByteArrayToBitMapImage(value as byte[]);
          }
          return img;
      }

      public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
      {
          return null;
      }
  }

2 Ответов

Рейтинг:
1

Richard Deeming

Вы избавляетесь от потока до того, как изображение попытается его прочитать.

Измените свой конвертер на:

public class ByteArrayToBitmapImageConverter : IValueConverter
{
    public static BitmapImage ConvertByteArrayToBitMapImage(byte[] imageByteArray)
    {
        BitmapImage img = new BitmapImage();
        img.StreamSource = new MemoryStream(imageByteArray);
        return img;
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var imageByteArray = value as byte[];
        if (imageByteArray == null) return null;
        return ConvertByteArrayToBitMapImage(imageByteArray);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}


Member 14064604

К сожалению, это не работает.

Когда я устанавливаю точки останова в конвертер, изображение, возвращаемое ConvertByteArrayToBitMapImage, имеет некоторые нулевые свойства и некоторые свойства, которые вызывают исключения:

Формат = 'img.Format' выбросил исключение типа 'System.Исключение InvalidOperationException'

Уже около года = 'ИМГ.DpiX" выбросил исключение типа " система.Исключение InvalidOperationException'


Я изменил привязку источника изображения к:



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

Richard Deeming

Похоже, что ваш байтовый массив не содержит допустимого изображения.

Рейтинг:
1

TurgayTürk

похоже, проблема с кэшированием..

настройте свой метод "ConvertByteArrayToBitMapImage" в вашем классе конвертера, как показано ниже, и он должен работать;

public BitmapImage ConvertByteArrayToBitMapImage(byte[] imageByteArray)
{
    BitmapImage img = new BitmapImage();
    using (MemoryStream memStream = new MemoryStream(imageByteArray))
    {
        img.BeginInit();
        img.CacheOption = BitmapCacheOption.OnLoad;
        img.StreamSource = memStream;
        img.EndInit();
        img.Freeze();
    }
    return img;
}