2009-08-21 57 views

回答

48

​​就是我一直在寻找

SystemIcons.Warning.ToBitmap(); 
29

您也可以在您的XAML SystemIcons如下:

在您的XAML中包含一个转换器(请参阅下面的代码)作为资源和一个Image控件。 此图片样本显示信息图标。

 <Window.Resources> 
     <Converters:SystemIconConverter x:Key="iconConverter"/> 
    </Window.Resources> 

    <Image Visibility="Visible" 
      Margin="10,10,0,1" 
      Stretch="Uniform" 
      MaxHeight="25" 
      VerticalAlignment="Top" 
      HorizontalAlignment="Left" 
      Source="{Binding Converter={StaticResource iconConverter}, ConverterParameter=Information}"/> 

这里是转换器的实现:

using System; 
using System.Drawing; 
using System.Globalization; 
using System.Reflection; 
using System.Windows; 
using System.Windows.Data; 
using System.Windows.Interop; 
using System.Windows.Media.Imaging; 

namespace Converters 
{ 
    [ValueConversion(typeof(string), typeof(BitmapSource))] 
    public class SystemIconConverter : IValueConverter 
    { 
     public object Convert(object value, Type type, object parameter, CultureInfo culture) 
     { 
     Icon icon = (Icon)typeof(SystemIcons).GetProperty(parameter.ToString(), BindingFlags.Public | BindingFlags.Static).GetValue(null, null); 
     BitmapSource bs = Imaging.CreateBitmapSourceFromHIcon(icon.Handle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); 
     return bs; 
     } 

     public object ConvertBack(object value, Type type, object parameter, CultureInfo culture) 
     { 
     throw new NotSupportedException(); 
     } 
    } 
} 
+0

非常感谢!这很好用!但是,我注意到StackOverflow在Creative Commons许可下运行。因此,我在技术上不能在未经您许可的情况下在我的商业应用程序中使用/修改您的代码(我不希望获得Creative Commons许可)。你愿意给我许可吗?我仍然可以信任你的工作。 – skybluecodeflier 2011-09-07 16:10:19

+0

@skybluecodeflier,发布到StackOverflow的任何代码都是创意共享:http://meta.stackexchange。com/questions/12527/do-i-have-to-worry-about-copyright-issues-for-code-posted-on-stack-overflow – 2014-05-01 20:06:09

+0

@Zbonboni你的转换器是否有任何特殊原因忽略了'value'值并执行仅使用'parameter'进行转换?这似乎是非常典型的转换器。 – 2016-10-17 11:59:32

12

正如其他人所指出SystemIcons是应该包含这些图标的类,但在Windows 8.1(也可能在早期版本太)的图标存在于SystemIcons中,与Asterisk,Information和Question中的MessageBoxes显示的不同。对话框上的图标看上去很多平坦的。见 - 例如 - 问号图标:

Question icon

对话框中的图标是本地对话框图标,并在后台窗体上的最左边的图标是从SystemIcons类检索到的图标。

有关如何从MessageBox中的图标看到这个answer各种方法和细节,但我在这里有一个简单的总结,只是为了完整起见:

您应该使用SHGetStockIconInfo功能:

SHSTOCKICONINFO sii = new SHSTOCKICONINFO(); 
sii.cbSize = (UInt32)Marshal.SizeOf(typeof(SHSTOCKICONINFO)); 

Marshal.ThrowExceptionForHR(SHGetStockIconInfo(SHSTOCKICONID.SIID_INFO, 
     SHGSI.SHGSI_ICON , 
     ref sii)); 
pictureBox1.Image = Icon.FromHandle(sii.hIcon).ToBitmap(); 

note

如果这个函数返回HIC的图标句柄在 SHSTOCKICONINFO结构成员指向PSII,你负责 释放图标与DestroyIcon当你不再需要它。

当然这个来工作,你必须定义一些枚举和结构:

public enum SHSTOCKICONID : uint 
{ 
    //... 
    SIID_INFO = 79, 
    //... 
} 

[Flags] 
public enum SHGSI : uint 
{ 
    SHGSI_ICONLOCATION = 0, 
    SHGSI_ICON = 0x000000100, 
    SHGSI_SYSICONINDEX = 0x000004000, 
    SHGSI_LINKOVERLAY = 0x000008000, 
    SHGSI_SELECTED = 0x000010000, 
    SHGSI_LARGEICON = 0x000000000, 
    SHGSI_SMALLICON = 0x000000001, 
    SHGSI_SHELLICONSIZE = 0x000000004 
} 

[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
public struct SHSTOCKICONINFO 
{ 
    public UInt32 cbSize; 
    public IntPtr hIcon; 
    public Int32 iSysIconIndex; 
    public Int32 iIcon; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260/*MAX_PATH*/)] 
    public string szPath; 
} 

[DllImport("Shell32.dll", SetLastError = false)] 
public static extern Int32 SHGetStockIconInfo(SHSTOCKICONID siid, SHGSI uFlags, ref SHSTOCKICONINFO psii);