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

时间:2010-04-03 21:30:57

标签: c# wpf icons

我正在我的WPF应用中制作自定义错误对话框,我想使用standard windows error icon。我可以从WPF获取特定于操作系统的图标吗?如果没有,有没有人知道从哪里得到.pngs的透明度?或者知道在Windows中从哪里提取它们?

到目前为止,我的搜索结果都没有。

10 个答案:

答案 0 :(得分:33)

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

答案 1 :(得分:29)

关于使用Standard Microsoft Icons

绝大多数开发人员都不知道Visual Studio附带了一个图像库。所以这里有两个突出显示它的链接:

关于使用Microsoft Visual Studio 2010 Image Library

关于使用Microsoft Visual Studio 2008 Image Library

答案 2 :(得分:9)

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

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

我使用此转换器将Icon转换为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();
    }
}

答案 3 :(得分:6)

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

这是不确定的方式。这些图标也可在Visual Studio中使用。从Visual Studio安装目录,导航到Common7 \ VS2008ImageLibrary \ xxxx \ VS2008ImageLibrary.zip + VS2008ImageLibrary \ Annotations&amp; Buttons \ ico_format \ WinVista \ error.ico。 Visual Studio安装中的redist.txt文件直接明确地赋予您在自己的应用程序中使用此图标的权利。

答案 4 :(得分:4)

如果默认大小合适,您可以使用.NET的SystemIcons类大致前三个步骤,请参阅modosansreves answer

所以它可以很简单:

 Imaging.CreateBitmapSourceFromHIcon(SystemIcons.Error.Handle)

答案 5 :(得分:2)

使用此:

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>

答案 6 :(得分:1)

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

Delphi示例:

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

答案 7 :(得分:0)

你可以这样绘制:

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

将SystemIcons.Error等转换为.png(保持透明度),然后将输出添加到资源,并像往常一样在WPF图像控件中使用。

var list1 = new List<Product>()
   {
      new Product(){Key1 = "Key1", Key2 ="Key2", Count1 = 1, Count2 = 2},
      new Product(){Key1 = "Key2", Key2 ="Key3", Count1 = 1, Count2 = 2}
   };

var list2 = new List<Product>()
   {
      new Product(){Key1 = "Key1", Key2 ="Key2", Count1 = 6, Count2 = 8},
      new Product(){Key1 = "Key2", Key2 ="Key3", Count1 = 10, Count2 = 12}
   };

var result = list1.Concat(list2)
                  .GroupBy(x => new {x.Key1,x.Key2})
                  .Select(x => new
                     {
                        x.Key.Key1,
                        x.Key.Key2,
                        SumCount1 = x.Sum(y => y.Count1),
                        SumCount2 = x.Sum(y => y.Count2)
                     }).ToList();