2009-08-21 10 views

Respuesta

48

SystemIcons es lo que estaba buscando

por ejemplo

SystemIcons.Warning.ToBitmap(); 
29

también puede incluir SystemIcons en su XAML de la siguiente manera:

Incluye un convertidor (consulta el código a continuación) como recurso y un control de imagen en tu XAML. Este ejemplo de imagen aquí muestra el icono de información.

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

Aquí está la aplicación para el convertidor:

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

Gracias tanto! Esto funciona genial! Sin embargo, noté que StackOverflow opera bajo la licencia de Creative Commons. Por lo tanto, técnicamente no puedo usar/adaptar su código en mi aplicación comercial (que no quiero que esté bajo la licencia de Creative Commons) sin su permiso. ¿Estás dispuesto a darme permiso? Aún puedo acreditar tu trabajo. – skybluecodeflier

+0

@skybluecodeflier, cualquier código publicado en StackOverflow es creative commons: http: //meta.stackexchange.com/questions/12527/do-i-have-to-worry-about-copyright-issues-for-code-posted-on-stack-overflow –

+0

@Zamboni ¿Hay alguna razón en particular por la que su convertidor ignora el 'valor' y funciona la conversión usando solo el 'parámetro'? Eso parece atípico de los convertidores. –

12

Como ya han dicho SystemIcons es la clase que debe contener los iconos, pero en Windows 8.1 (y, posiblemente, en las versiones anteriores también) los iconos presente en el SystemIcons difieren de los que se muestran en el MessageBoxes en el caso de Asterisk, Información y Pregunta. Los íconos en el diálogo se ven mucho más aplanado. Ver - por ejemplo - el icono Pregunta:

Question icon

El icono en el cuadro de diálogo es el icono de diálogo nativo, y el icono más a la izquierda en el formulario en el fondo es el icono recuperado de la clase SystemIcons.

Por diversos métodos y detalles acerca de cómo obtener el icono del cuadro de mensaje ver este answer, pero incluyo aquí un breve resumen, por el simple hecho de exhaustividad:

Se debe utilizar la función de 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(); 

favor note:

Si esta función devuelve un identificador de icono en la HIC en miembro de la estructura SHSTOCKICONINFO apuntado por PSII, usted es responsable de liberando el icono con DestroyIcon cuando ya no lo necesite.

Por supuesto, para que esto funcione, tendrá que definir algunas enumeraciones y estructuras:

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); 
Cuestiones relacionadas