Come ottengo un System.Drawing.Image per i vari System.Windows.MessageBoxImage (s) e/o System.Windows. Forms.MessageBoxIcon (s)Come ottengo un'immagine per i vari MessageBoxImage (s) o MessageBoxIcon (s)
risposta
è inoltre possibile includere nel vostro SystemIcons XAML come segue:
Includi un convertitore (vedi il codice di seguito) come risorsa e un controllo Immagine nel tuo XAML. Questo esempio di immagine qui mostra l'icona delle informazioni.
<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}"/>
Ecco l'implementazione per il convertitore:
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();
}
}
}
Come altri hanno detto SystemIcons
è la classe che dovrebbe contenere quelle icone, ma su Windows 8.1 (e, eventualmente, nelle versioni precedenti troppo) le icone presente nel SystemIcons
differiscono da quelli visualizzati su MessageBoxes
nel caso di Asterisco, Informazioni e Domanda. Le icone nella finestra di dialogo sembrano molto più semplici . See - per esempio - l'icona Domanda:
L'icona nella finestra di dialogo è l'icona nativa, e l'icona più a sinistra nel modulo in fondo è l'icona recuperate dalla classe SystemIcons
.
Per vari metodi e dettagli su come ottenere l'icona dal MessageBox vedere questo answer, ma io includo qui un riassunto veloce, solo per ragioni di completezza:
si dovrebbe utilizzare la funzione 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();
prega note:
Se questa funzione restituisce un handle di icona nella hic su membro della struttura SHSTOCKICONINFO puntata da PSII, siete responsabili per liberare l'icona con DestroyIcon quando non è più necessaria.
Naturalmente per far funzionare tutto questo si dovrà definire un paio di enumerazioni e le strutture:
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);
Grazie mille! Funziona alla grande! Tuttavia, ho notato che StackOverflow opera sotto la licenza Creative Commons. Quindi tecnicamente non posso usare/adattare il tuo codice nella mia domanda commerciale (che non voglio essere sotto la licenza Creative Commons) senza il tuo permesso. Sei disposto a darmi il permesso? Posso ancora accreditare il tuo lavoro. – skybluecodeflier
@skybluecodeflier, qualsiasi codice pubblicato su StackOverflow è comune creativo: http: //meta.stackexchange.it/questions/12527/do-i-have-to-about-copyright-issues-for-code-posted-on-stack-overflow –
@Zamboni C'è qualche ragione particolare per cui il tuo convertitore ignora il 'valore' ed esegue la conversione usando solo il 'parametro'? Sembra atipico per i convertitori. –