Cómo obtengo System.Drawing.Image para las diversas System.Windows.MessageBoxImage (s) y/o System.Windows. Forms.MessageBoxIcon (s)¿Cómo obtengo una imagen para las diferentes MessageBoxImage (s) o MessageBoxIcon (s)
Respuesta
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();
}
}
}
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:
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);
- 1. decimal (s, p) o número (s, p)?
- 2. rieles o carriles s exec del paquete de s
- 3. jQuery para Cmd + s y Ctrl + s
- 4. Usando llamadas al sistema desde C, ¿cómo obtengo la utilización de la (s) CPU (s)?
- 5. ¿Cómo puedo calcular MB/s y MiB/s?
- 6. ¿Cómo obtener los campos privados de clase y su (s) clase (s) primaria (s) por reflexión?
- 7. Excepción XML: carácter (s) inválido (s)
- 8. En Perl, ¿cuál es la diferencia entre s/^ \ s + // y s/\ s + $ //?
- 9. Comparando dos ObservableCollection (s) para ver si son diferentes
- 10. ¿Qué protocolo? svn: // o http (s): //?
- 11. Varios `con`s en` try`s
- 12. ¿Hay alguna (s) biblioteca (s) rápida (s) para encontrar ojos y boca humanos en Flash? (Actionscript)
- 13. ¿Qué patrón (s) arquitectónico (s) debo usar para mi RIA?
- 14. Sinónimo (s) múltiple (s) para los términos de búsqueda
- 15. ¿Fuente (s) recomendada (s) para mostrar los caracteres Unicode?
- 16. ¿Puede (s es "") y (s == "") dar resultados diferentes en Python 2.6.2?
- 17. cuerdas s; &s+1; Legal? UB?
- 18. Cuando "" == s es falso pero "" .equals (s) es verdadero
- 19. transformando de 'S' o 'N' al bit
- 20. ¿Cómo puedo especificar una entrada Eclipse .classpath para una plataforma O/S específica?
- 21. Determine si O/S es Windows 7
- 22. ¿Cuál es la diferencia entre [\ s \ S] *? y. *?
- 23. ¿Hay alguna diferencia entre/\ s/g y/\ s +/g?
- 24. '% s' % '' someString
- 25. sed - opción desconocida para `s'
- 26. Cómo escribir una etiqueta RFID para leer Nexus S NFC?
- 27. Backbone-relational.js + Backbone.View (s)
- 28. Látex: cómo romper una línea dentro $$ - s
- 29. Cómo eliminar 0's de una cadena
- 30. mySQL: Múltiples COUNT() s basadas en diferentes criterios
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
@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 –
@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. –