代码之家  ›  专栏  ›  技术社区  ›  Steve Cooper

使用XAML将System.Drawing.Image绑定到System.Windows.Image控件中

  •  12
  • Steve Cooper  · 技术社区  · 14 年前

    我将ListView绑定到对象列表,如下所示;

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

    我绑定到一个声明两个属性的对象;

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

    我想填充一个 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')
    
    2 回复  |  直到 14 年前
        1
  •  36
  •   Steve Cooper    14 年前

    找到了一个我满意的方法。使用 Reed Copsey's pointer this tutorial 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} }" />
    
        2
  •  5
  •   Reed Copsey    14 年前

    你不能直接绑定它-你需要有某种类型的转换器将GDI图像转换成WPF图像。

    one approach -它使用内存流从GDI图像中提取数据并创建BitmapSource对象。