我有一个WPF应用程序,需要从可执行文件中提取图标.
我在这里发现我可以做到这一点
Icon ico = Icon.ExtractAssociatedIcon(theProcess.MainModule.FileName);
Run Code Online (Sandbox Code Playgroud)
但是当我尝试设置WPF图像的来源时,我得到了
"无法将类型'System.Drawing.Icon'隐式转换为'System.Windows.Media.ImageSource'
有什么建议 ?
ali*_*aek 11
我想提供我想出的解决方案:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个IconToImageSourceConverter,只需调用上面的方法.
为了方便我将图标添加为图像,我还添加了以下内容:
<DataTemplate DataType="{x:Type drawing:Icon}">
<Image Source="{Binding Converter={converter:IconToImageSourceConverter}}"
MaxWidth="{Binding Width}" MaxHeight="{Binding Height}"/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
这样,如果仍然会显示一个图标直接放在XAML中:
<x:Static MemberType="{x:Type drawing:SystemIcons}" Member="Asterisk"/>
Run Code Online (Sandbox Code Playgroud)
否则转换器可以在位置上使用,如下所示:
<Image Source="{Binding Source={x:Static drawing:SystemIcons.Asterisk},
Converter={converter:IconToImageSourceConverter}}"/>
Run Code Online (Sandbox Code Playgroud)
Han*_*ant 10
图标在.NET框架中得不到爱.您必须使用Icon.Save()将您获得的图标保存到MemoryStream中.这允许您使用获取流的IconBitmapDecoder构造函数.
System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon方法可用于将a转换System.Drawing.Icon为wpf BitmapSource。
using(Icon ico = Icon.ExtractAssociatedIcon(theProcess.MainModule.FileName))
{
image.Source = Imaging.CreateBitmapSourceFromHIcon(ico.Handle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
}
Run Code Online (Sandbox Code Playgroud)
小智 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);
}
Run Code Online (Sandbox Code Playgroud)
我们可以使用此图像源将属性源输入XAML:
<Image Source="{Binding Path=ImageSource, Mode=OneTime}" />
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14881 次 |
| 最近记录: |