我正在我的WPF应用中制作自定义错误对话框,我想使用standard windows error icon。我可以从WPF获取特定于操作系统的图标吗?如果没有,有没有人知道从哪里得到.pngs的透明度?或者知道在Windows中从哪里提取它们?
到目前为止,我的搜索结果都没有。
答案 0 :(得分:33)
有一个SystemIcons类,但需要调整WPF需求(即将Icon
转换为ImageSource
)。
答案 1 :(得分:29)
绝大多数开发人员都不知道Visual Studio附带了一个图像库。所以这里有两个突出显示它的链接:
答案 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();