在WPF图像中显示图标

问题描述 投票:12回答:4

我有一个WPF应用程序,需要从可执行文件中提取图标。

我发现here我能做到这一点

Icon ico = Icon.ExtractAssociatedIcon(theProcess.MainModule.FileName);

但是当我尝试设置WPF图像的来源时,我得到了

“无法将类型'System.Drawing.Icon'隐式转换为'System.Windows.Media.ImageSource'

有什么建议 ?

c# wpf icons
4个回答
9
投票

图标在.NET框架中得不到爱。您必须使用Icon.Save()将您获得的图标保存到MemoryStream中。这允许您使用获取流的IconBitmapDecoder构造函数。


9
投票

我想提供我想出的解决方案:

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;
    }

}

然后我有一个IconToImageSourceConverter,只需调用上面的方法。

为了方便我将图标添加为图像,我还添加了以下内容:

<DataTemplate DataType="{x:Type drawing:Icon}">
    <Image Source="{Binding Converter={converter:IconToImageSourceConverter}}" 
        MaxWidth="{Binding Width}" MaxHeight="{Binding Height}"/>
</DataTemplate>

这样,如果仍然会显示一个图标直接放在XAML中:

<x:Static MemberType="{x:Type drawing:SystemIcons}" Member="Asterisk"/>

否则转换器可以在位置上使用,如下所示:

<Image Source="{Binding Source={x:Static drawing:SystemIcons.Asterisk}, 
    Converter={converter:IconToImageSourceConverter}}"/>                

8
投票

System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon方法可用于将System.Drawing.Icon转换为wpf BitmapSource

using(Icon ico = Icon.ExtractAssociatedIcon(theProcess.MainModule.FileName))
{
    image.Source = Imaging.CreateBitmapSourceFromHIcon(ico.Handle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
}

5
投票

我遇到了类似的问题,只需几步即可获得图像源:

ImageSource imageSource;

Icon icon = Icon.ExtractAssociatedIcon(path);

using (Bitmap bmp = icon.ToBitmap())
{
   var stream = new MemoryStream();
   bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
   imageSource = BitmapFrame.Create(stream);
}

我们可以使用此图像源来输出XAML中的属性源:

 <Image Source="{Binding Path=ImageSource, Mode=OneTime}" />
© www.soinside.com 2019 - 2024. All rights reserved.