Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Display Icon in WPF Image

Tags:

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 ?

like image 499
irco Avatar asked Jun 03 '10 21:06

irco


People also ask

How to insert icon in WPF?

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.


2 Answers

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());
}
like image 62
Alex.Wei Avatar answered Sep 19 '22 15:09

Alex.Wei


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}}"/>                
like image 39
aliceraunsbaek Avatar answered Sep 17 '22 15:09

aliceraunsbaek