2009-08-21 26 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);