如何在我的WPF应用程序中使用标准的Windows警告/错误图标?

我在我的WPF应用程序中进行自定义错误对话框,我想使用一个标准的Windows错误图标 。 我可以从WPF获得操作系统特定的图标吗? 如果没有,有谁知道在哪里得到与他们的透明度.pngs? 或者知道在哪里从Windows中提取它们?

到目前为止,我的search没有任何结果。

有一个SystemIcons类,但它需要调整WPF的需要(即将Icon转换为ImageSource )。

关于使用标准的Microsoft图标 。

那里的绝大多数开发人员不知道Visual Studio带有一个图像库。 所以这里有两个链接来强调它:

关于使用Microsoft Visual Studio 2010图像库 。

关于使用Microsoft Visual Studio 2008图像库 。

在Visual Studio中,使用File + Open + File并selectc:\ windows \ system32 \ user32.dll。 打开图标节点并双击103.在我的机器上,这是错误图标。 返回,右键单击它并select导出将其保存到文件。

这是有道理的。 这些图标在Visual Studio中也是可用的。 在Visual Studio安装目录中,导航到Common7 \ VS2008ImageLibrary \ xxxx \ VS2008ImageLibrary.zip + VS2008ImageLibrary \ Annotations&Buttons \ ico_format \ WinVista \ error.ico。 Visual Studio安装中的redist.txt文件直接显式地给你在自己的应用程序中使用这个图标的权利。

这是我在XAML中使用系统图标的方式:

 xmlns:draw="clr-namespace:System.Drawing;assembly=System.Drawing" ... <Image Source="{Binding Source={x:Static draw:SystemIcons.Warning}, Converter={StaticResource IconToImageSourceConverter}, Mode=OneWay}" /> 

我用这个转换器把图标变成ImageSource:

 public class IconToImageSourceConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var icon = value as Icon; if (icon == null) { Trace.TraceWarning("Attempted to convert {0} instead of Icon object in IconToImageSourceConverter", value); return null; } ImageSource imageSource = Imaging.CreateBitmapSourceFromHIcon( icon.Handle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); return imageSource; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } 
  • 使用OIC_ERROR( 其他图标可用 ,但您想要错误/停止图标)调用LoadImage ,则需要LR_SHARED标志。
  • 如果你想要不同的大小,p / invoke CopyImage
  • 使用从LoadImage获得的IntPtr调用System.Drawing.Icon.FromHandle
  • 对于GDI +, 绘制您的Drawing.Icon或克隆它供以后使用 。
  • 对于WPF, 把它变成一个BitmapSource
  • 如果使用CopyImage,则调用DestroyIcon

你可以使用.NET的SystemIcons类大致前三个步骤,如果默认大小是好的,请参阅modosansreves答案

所以可以这样简单:

  Imaging.CreateBitmapSourceFromHIcon(SystemIcons.Error.Handle) 

你不能简单地使用Windows API吗?

Delphi例子:

 procedure TForm1.FormClick(Sender: TObject); var errIcon: HICON; begin errIcon := LoadIcon(0, IDI_ERROR); DrawIcon(Canvas.Handle, 10, 10, errIcon) end; 

用这个:

 using System; using System.Drawing; using System.Windows; using System.Windows.Interop; using System.Windows.Markup; using System.Windows.Media.Imaging; using Extensions { [ContentProperty("Icon")] public class ImageSourceFromIconExtension : MarkupExtension { public Icon Icon { get; set; } public ImageSourceFromIconExtension() { } public ImageSourceFromIconExtension(Icon icon) { Icon = icon; } public override object ProvideValue(IServiceProvider serviceProvider) { return Imaging.CreateBitmapSourceFromHIcon(Icon.Handle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); } } } 

不要忘记将System.Drawing引用从全局位置添加到您的项目中。

然后在你的xaml中使用这个:

 <WindowOrSomething x:Class="BlaBlaWindow" xmlns:draw="clr-namespace:System.Drawing;assembly=System.Drawing" xmlns:ext="clr-namespace:Extensions"> <Image Source="{ext:ImageSourceFromIcon {x:Static draw:SystemIcons.Error}}"/> </WindowOrSomething> 

你可以这样画出来:

 Graphics g = this.CreateGraphics(); g.DrawIcon(SystemIcons.Question, 40, 40); 

使用SystemIcons并将它们转换为像这样的ImageSource

 try { var temp = SystemIcons.WinLogo.ToBitmap(); //Your icon here BitmapImage bitmapImage = new BitmapImage(); using (MemoryStream memory = new MemoryStream()) { temp.Save(memory, ImageFormat.Png); memory.Position = 0; bitmapImage.BeginInit(); bitmapImage.StreamSource = memory; bitmapImage.CacheOption = BitmapCacheOption.OnLoad; bitmapImage.EndInit(); } this.Icon = bitmapImage; } catch (Exception ex) { this.Icon = null; }