Display Icon in WPF Image
System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon
method can be use to convert a System.Drawing.Icon
to wpf BitmapSource
.
using(Icon ico = Icon.ExtractAssociatedIcon(theProcess.MainModule.FileName)){ image.Source = Imaging.CreateBitmapSourceFromHIcon(ico.Handle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());}
I wanted to offer the solution I've come up with:
public static class IconExtensions{ [DllImport("gdi32.dll", SetLastError = true)] private static extern bool DeleteObject(IntPtr hObject); public static ImageSource ToImageSource(this Icon icon) { Bitmap bitmap = icon.ToBitmap(); IntPtr hBitmap = bitmap.GetHbitmap(); ImageSource wpfBitmap = Imaging.CreateBitmapSourceFromHBitmap( hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); if (!DeleteObject(hBitmap)) { throw new Win32Exception(); } return wpfBitmap; }}
I then have a IconToImageSourceConverter that simply calls the method above.
To make it easy for me to add icons as images I also added this:
<DataTemplate DataType="{x:Type drawing:Icon}"> <Image Source="{Binding Converter={converter:IconToImageSourceConverter}}" MaxWidth="{Binding Width}" MaxHeight="{Binding Height}"/></DataTemplate>
This way, if an icon is placed directly in XAML if will still be shown:
<x:Static MemberType="{x:Type drawing:SystemIcons}" Member="Asterisk"/>
Otherwise the converter can be used on location, like so:
<Image Source="{Binding Source={x:Static drawing:SystemIcons.Asterisk}, Converter={converter:IconToImageSourceConverter}}"/>
Icons get no love in the .NET framework. You'll have to use Icon.Save() to save the icon you got into a MemoryStream. Which allows you to use the IconBitmapDecoder constructor that takes a stream.