использование XAML для привязки с Системой. Рисование. Изображение в Систему. Windows. Управление изображением

Я связываю ListView со списком объектов, как так;

<ListView 
    ItemsSource="{ Binding Path=. }"
    ItemTemplate="{DynamicResource EventTemplate}">   

Я связываю с объектом, который объявляет два свойства;

string DisplayName { get; }
System.Drawing.Image Image { get; set; }

Я хочу заполнить a DataTemplate но я не могу выяснить как; если я делаю это в своем шаблоне;

<StackPanel Orientation="Horizontal">
    <Image Source="{ Binding Path=Image }" />
    <TextBlock Text="{ Binding Path=DisplayName }" />
</StackPanel>      

Текст появляется, но изображение не делает. Что я делаю неправильно? Отладка произвела шоу

System.Windows.Data Error: 1 : Cannot create default converter
to perform 'one-way' conversions between types
'System.Drawing.Image' and 'System.Windows.Media.ImageSource'.
Consider using Converter property of Binding.
BindingExpression:Path=Image; DataItem='RealElement'
(HashCode=54308798); target element is 'Image' (Name='');
target property is 'Source' (type 'ImageSource')
12
задан Steve Cooper 6 August 2010 в 19:22
поделиться

2 ответа

Нашел способ, которым я доволен. Используя указатель Рида Копси и в этом руководстве , я обернул код как IValueConverter .

Вот конвертер из System.Drawing.Image в System.Windows.Media.ImageSource ;

using System;
using System.Drawing.Imaging;
using System.Globalization;
using System.IO;
using System.Windows.Data;

namespace System.Windows.Media
{
    /// <summary>
    /// One-way converter from System.Drawing.Image to System.Windows.Media.ImageSource
    /// </summary>
    [ValueConversion(typeof(System.Drawing.Image), typeof(System.Windows.Media.ImageSource))]
    public class ImageConverter : IValueConverter
    {
        public object Convert(object value, Type targetType,
            object parameter, CultureInfo culture)
        {
            // empty images are empty...
            if (value == null) { return null; }

            var image = (System.Drawing.Image)value;
            // Winforms Image we want to get the WPF Image from...
            var bitmap = new System.Windows.Media.Imaging.BitmapImage();
            bitmap.BeginInit();
            MemoryStream memoryStream = new MemoryStream();
            // Save to a memory stream...
            image.Save(memoryStream, ImageFormat.Bmp);
            // Rewind the stream...
            memoryStream.Seek(0, System.IO.SeekOrigin.Begin);
            bitmap.StreamSource = memoryStream;
            bitmap.EndInit();
            return bitmap;
        }

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

Затем вам нужно перенести конвертер изображений в XAML в качестве ресурса;

xmlns:med="clr-namespace:System.Windows.Media"
...

<ListView.Resources>
    <med:ImageConverter x:Key="imageConverter" />
</ListView.Resources>

Затем вы можете использовать его в XAML для прямой привязки к изображению, используя новый конвертер;

<Image Source="{ Binding Path=Image, Converter={StaticResource imageConverter} }" />
35
ответ дан 2 December 2019 в 03:48
поделиться

Вы не можете связать это напрямую - вам нужен какой-то конвертер, который будет преобразовывать GDI-изображение в WPF-изображение.

Вот один из подходов - он использует поток памяти для получения данных из GDI-изображения и создания объекта BitmapSource.

4
ответ дан 2 December 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: