2010-04-03 18 views
37

Estoy creando un diálogo de error personalizado en mi aplicación WPF y quiero usar un standard windows error icon. ¿Puedo obtener el icono específico del sistema operativo de WPF? Si no, ¿alguien sabe dónde obtener .pngs con transparencia de ellos? ¿O sabe dónde en Windows para extraerlos?¿Cómo uso los iconos estándar de advertencia/error de Windows en mi aplicación WPF?

Hasta ahora mis búsquedas no han encontrado nada.

+0

quiero que la misma imagen sin importar la plataforma, o les gustaría el icono correspondiente a la versión actual de Windows (incluyendo versiones futuras)? –

+0

Idealmente, un icono que se parece al icono estándar para esa versión de Windows. Pero puedo conformarme con obtener el estándar para Vista/7. – RandomEngy

Respuesta

32

Hay una clase SystemIcons, pero necesita un ajuste para las necesidades de WPF (es decir convirtiendo Icon en ImageSource).

+1

Has obviado por completo la necesidad de p/invoke. Buena llamada. –

+3

por cierto, http://stackoverflow.com/questions/1127647/convert-system-drawing-icon-to-system-media-imagesource, esto puede ayudar –

+3

Ese otro hilo tiene unos cuatro pasos de más. Use http://msdn.microsoft.com/en-us/library/system.windows.interop.imaging.createbitmapsourcefromhicon(v=VS.90).aspx –

6

En Visual Studio, use Archivo + Abrir + Archivo y seleccione c: \ windows \ system32 \ user32.dll. Abra el nodo Icono y haga doble clic en 103. En mi máquina, ese es el ícono de Error. Atrás, haga clic con el botón derecho y seleccione Exportar para guardarlo en un archivo.

Esa es la manera dudosa. Estos iconos también están disponibles en Visual Studio. Desde su directorio de instalación de Visual Studio, navegue a Common7 \ VS2008ImageLibrary \ xxxx \ VS2008ImageLibrary.zip + VS2008ImageLibrary \ Annotations & Buttons \ ico_format \ WinVista \ error.ico. El archivo redist.txt en la instalación de Visual Studio directamente explícitamente le da el derecho de usar este ícono en su propia aplicación.

+0

En realidad, los ID de recursos no gestionados están # definidos en winuser.h y compilados en literalmente millones de programas por ahora. Entonces ellos no están cambiando. El índice dentro de la DLL e incluso qué DLL contiene los íconos del sistema pueden cambiar, pero el ID del recurso nunca lo hará. –

+0

@Ben: no, MB_ICONERROR tiene el valor 0x10. No cerca de la identificación del recurso. De nuevo: si tiene un conocimiento especial de cómo funciona esto, puhleze, publique su propia respuesta. –

+0

Parece decidido a hacer que todo sea personal en lugar de dejar que cada tema técnico sea independiente. En este caso particular, puede educarse leyendo la respuesta que estaba escribiendo al publicar la suya y varias horas antes de su comentario. El ID de recurso OIC_HAND o equivalente OIC_ERROR, que se utiliza con la macro MAKEINTRESOURCE, no ha cambiado desde que se presentó LoadImage y nunca puede hacerlo, ya que se compila en millones de programas. –

1

¿No puede simplemente usar la API de Windows?

Delphi Ejemplo:

procedure TForm1.FormClick(Sender: TObject); 
var 
    errIcon: HICON; 
begin 
    errIcon := LoadIcon(0, IDI_ERROR); 
    DrawIcon(Canvas.Handle, 10, 10, errIcon) 
end; 
4

Puede utilizar la clase SystemIcons de .NET durante aproximadamente los primeros tres pasos si el tamaño por defecto está bien, ver modosansreves answer

por lo que podría ser tan simple como:

Imaging.CreateBitmapSourceFromHIcon(SystemIcons.Error.Handle) 
0

se puede dibujar de esta manera:

Graphics g = this.CreateGraphics(); 
g.DrawIcon(SystemIcons.Question, 40, 40); 
+1

... no 'Gráficos' en WPF. Lo que escribiste es para GDI. –

+0

GDI + en realidad, pero es verdad que ninguno de nosotros ha proporcionado la conversión a una imagen WPF. No estoy familiarizado con WPF, pero estoy seguro de que alguien sabe cómo hacerlo. –

0

uso SystemIcons y convertirlos a un ImageSource así:

try 
{ 
    var temp = SystemIcons.WinLogo.ToBitmap(); //Your icon here 
    BitmapImage bitmapImage = new BitmapImage(); 
    using (MemoryStream memory = new MemoryStream()) 
    { 
     temp.Save(memory, ImageFormat.Png); 
     memory.Position = 0; 
     bitmapImage.BeginInit(); 
     bitmapImage.StreamSource = memory; 
     bitmapImage.CacheOption = BitmapCacheOption.OnLoad; 
     bitmapImage.EndInit(); 
    } 
    this.Icon = bitmapImage; 
} 
catch (Exception ex) 
{ 
    this.Icon = null; 
} 
5

Así es como he usado un icono Sistema en XAML:

xmlns:draw="clr-namespace:System.Drawing;assembly=System.Drawing" 
... 
<Image Source="{Binding Source={x:Static draw:SystemIcons.Warning}, 
     Converter={StaticResource IconToImageSourceConverter}, 
     Mode=OneWay}" /> 

utilicé este convertidor para convertir un icono a ImageSource :

public class IconToImageSourceConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var icon = value as Icon; 
     if (icon == null) 
     { 
      Trace.TraceWarning("Attempted to convert {0} instead of Icon object in IconToImageSourceConverter", value); 
      return null; 
     } 

     ImageSource imageSource = Imaging.CreateBitmapSourceFromHIcon(
      icon.Handle, 
      Int32Rect.Empty, 
      BitmapSizeOptions.FromEmptyOptions()); 
     return imageSource; 
    } 

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

¿También tiene un método de extensión personalizado llamado ToImageSource()? No pude encontrar nada incorporado que hiciera eso. – RandomEngy

+0

Sí, me olvidé de eso. Agregué el código del método de extensión al convertidor mismo. – run2thesun

1

Utilice esta:

using System; 
using System.Drawing; 
using System.Windows; 
using System.Windows.Interop; 
using System.Windows.Markup; 
using System.Windows.Media.Imaging; 

using Extensions 
{ 
    [ContentProperty("Icon")] 
    public class ImageSourceFromIconExtension : MarkupExtension 
    { 
     public Icon Icon { get; set; } 

     public ImageSourceFromIconExtension() 
     { 
     } 

     public ImageSourceFromIconExtension(Icon icon) 
     { 
      Icon = icon; 
     } 

     public override object ProvideValue(IServiceProvider serviceProvider) 
     { 
      return Imaging.CreateBitmapSourceFromHIcon(Icon.Handle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); 
     } 
    } 
} 

No olvide agregar la referencia de System.Drawing a su proyecto desde una ubicación global.

A continuación, utilice esto en su xaml:

<WindowOrSomething x:Class="BlaBlaWindow" 
    xmlns:draw="clr-namespace:System.Drawing;assembly=System.Drawing" 
    xmlns:ext="clr-namespace:Extensions"> 
    <Image Source="{ext:ImageSourceFromIcon {x:Static draw:SystemIcons.Error}}"/> 
</WindowOrSomething> 
Cuestiones relacionadas