I have a WPF application that needs to extract the icon off of an executable.
I found here that I can do this
Icon ico = Icon.ExtractAssociatedIcon(theProcess.MainModule.FileName);
but when I try to set the source of a WPF Image I get
"Cannot implicitly convert type 'System.Drawing.Icon' to 'System.Windows.Media.ImageSource'
Any suggestions ?
To add an icon to a project, right click on the project name in Solution Explorer. Right click will open Add Items menu. Select Add >> New Item. Now on Installed Templates, select Icon File (see Figure 1) and click Add.
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}}"/>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With