using XAML to bind to a System.Drawing.Image into a System.Windows.Image control

后端 未结 2 1481
天涯浪人
天涯浪人 2020-12-08 23:17

I\'m binding a ListView to a list of objects, like so;



        
相关标签:
2条回答
  • 2020-12-08 23:36

    Found a way I'm happy with. Using Reed Copsey's pointer and this tutorial I've wrapped the code as a IValueConverter.

    Here's the converter from System.Drawing.Image to 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;
            }
        }
    }
    

    Then you need to bring the image converter into XAML as a resource;

    xmlns:med="clr-namespace:System.Windows.Media"
    ...
    
    <ListView.Resources>
        <med:ImageConverter x:Key="imageConverter" />
    </ListView.Resources>
    

    Then you can use it in XAML to bind directly to the Image, using the new converter;

    <Image Source="{ Binding Path=Image, Converter={StaticResource imageConverter} }" />
    
    0 讨论(0)
  • 2020-12-08 23:39

    You can't bind that directly - you need to have some type of converter that will convert from a GDI Image to a WPF Image.

    Here is one approach - it uses a memory stream to pull the data from the GDI image and create a BitmapSource object.

    0 讨论(0)
提交回复
热议问题