2009-08-21 4 views

ответ

29

Вы можете также включить SystemIcons в вашем XAML следующим образом:

Включите конвертер (см. Код ниже) в качестве ресурса и элемент управления изображением в вашем XAML. Этот образец изображения здесь показывает значок информации.

 <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

+0

@skybluecodeflier, любой код, отправленный в StackOverflow, является творческим достоянием: http: //meta.stackexchange.com/questions/12527/do-i-have-to-worry-about-copyright-issues-for-code-posted-on-stack-overflow –

+0

@ Zamboni Есть ли какая-то особая причина, по которой ваш конвертер игнорирует «значение» и выполняет преобразование, использующее только параметр? Это кажется нетипичным для преобразователей. –

12

Как уже указано SystemIcons класс, который должен содержать эти значки, а на ОС Windows 8.1 (и, возможно, в более ранних версиях тоже) значках присутствующие в SystemIcons, отличаются от символов, отображаемых на MessageBoxes в случае Asterisk, информации и вопроса. Значки в диалоговом окне выглядят много flatter. См - например - значок Вопрос:

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); 
Смежные вопросы