2009-08-21 26 views

Trả lời

48

SystemIcons là những gì tôi đang tìm kiếm

ví dụ

SystemIcons.Warning.ToBitmap(); 
29

bạn cũng có thể bao gồm SystemIcons trong XAML của bạn như sau:

Bao gồm bộ chuyển đổi (xem mã bên dưới) dưới dạng Tài nguyên và điều khiển Hình ảnh trong XAML của bạn. Mẫu Hình ảnh này ở đây hiển thị biểu tượng thông tin.

 <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}"/> 

Đây là việc thực hiện cho bộ chuyển đổi:

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

Cảm ơn rất nhiều! Điều này hoạt động tuyệt vời! Tuy nhiên, tôi nhận thấy rằng StackOverflow hoạt động theo giấy phép Creative Commons. Vì vậy, về mặt kỹ thuật tôi không thể sử dụng/điều chỉnh mã của bạn trong ứng dụng thương mại của tôi (mà tôi không muốn theo giấy phép Creative Commons) mà không có sự cho phép của bạn. Bạn có sẵn sàng cho phép tôi không? Tôi vẫn có thể ghi nhận công việc của bạn. – skybluecodeflier

+0

@skybluecodeflier, bất kỳ mã nào được đăng lên StackOverflow đều là commons sáng tạo: http: //meta.stackexchange.com/questions/12527/do-i-have-to-lo-about-copyright-issues-cho-code-posted-on-stack-overflow –

+0

@Zamboni Có lý do cụ thể nào mà trình chuyển đổi của bạn bỏ qua 'giá trị' và thực hiện không chuyển đổi chỉ sử dụng 'tham số'? Điều đó có vẻ không điển hình của bộ chuyển đổi. –

12

Như những người khác đã tuyên bố SystemIcons là lớp học mà nên chứa những biểu tượng, nhưng trên Windows 8.1 (và có thể trên các phiên bản trước đó quá) các biểu tượng có mặt trong các SystemIcons khác với những người được hiển thị trên MessageBoxes trong trường hợp của Asterisk, thông tin và câu hỏi. Các biểu tượng trên hộp thoại trông nhiều hơn phẳng hơn. Xem - ví dụ - biểu tượng Câu hỏi:

Question icon

Biểu tượng trong hộp thoại là biểu tượng thoại bản địa, và các biểu tượng bên trái về hình thức trong nền là biểu tượng lấy từ lớp SystemIcons.

Đối với các phương pháp khác nhau và chi tiết về cách để có được những biểu tượng từ MessageBox thấy answer này, nhưng tôi bao gồm ở đây một bản tóm tắt nhanh chóng, chỉ vì lợi ích của sự hoàn chỉnh:

Bạn nên sử dụng SHGetStockIconInfo chức năng:

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(); 

Hãy note:

Nếu hàm này trả về một tay cầm biểu tượng trong HIC trên thành viên của cấu trúc SHSTOCKICONINFO trỏ đến bởi PSII, bạn có trách nhiệm giải phóng vào biểu tượng với DestroyIcon khi bạn không còn cần đến nó.

Tất nhiên để làm việc này, bạn sẽ phải xác định một vài enums và cấu trúc:

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); 
Các vấn đề liên quan