Comment obtenir une image System.Drawing.Image pour les différentes System.Windows.MessageBoxImage (s) et/ou System.Windows. Forms.MessageBoxIcon (s)Comment obtenir une image pour les différentes MessageBoxImage (s) ou MessageBoxIcon (s)
Répondre
Vous pouvez également inclure SystemIcons dans votre XAML comme suit:
Incluez un convertisseur (voir le code ci-dessous) en tant que ressource et un contrôle Image dans votre code XAML. Cet exemple d'image montre ici l'icône d'information.
<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}"/>
Voici la mise en œuvre du convertisseur:
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();
}
}
}
Comme d'autres ont déclaré SystemIcons
est la classe qui doit contenir les icônes, mais sur Windows 8.1 (et peut-être sur les versions antérieures aussi) les icônes présents dans le SystemIcons
diffèrent de ceux affichés sur le MessageBoxes
dans le cas de Asterisk, Information and Question. Les icônes de la boîte de dialogue ressemblent beaucoup flatter. Voir - par exemple - l'icône Question:
L'icône dans la boîte de dialogue est l'icône de dialogue native, et l'icône sur la gauche forme en arrière-plan est l'icône récupéré de la classe SystemIcons
.
Pour diverses méthodes et des détails sur la façon d'obtenir l'icône de la MessageBox voir ce answer, mais je ajoute ici un résumé rapide, juste pour être complet:
Vous devez utiliser la fonction 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();
S'il vous plaît note:
Si cette fonction retourne une poignée d'icône dans la HIC sur membre du SHSTOCKICONINFO la structure pointée par PSII, vous êtes responsable de libérer l'icône avec DestroyIcon lorsque vous ne avez plus besoin.
Bien sûr, pour que cela fonctionne, vous devrez définir quelques énumérations et struct:
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);
Merci beaucoup! Cela fonctionne très bien! Cependant, j'ai remarqué que StackOverflow fonctionne sous licence Creative Commons. Ainsi, techniquement, je ne peux pas utiliser/adapter votre code dans mon application commerciale (que je ne veux pas être sous licence Creative Commons) sans votre permission. Êtes-vous prêt à me donner la permission? Je peux toujours créditer votre travail. – skybluecodeflier
@skybluecodeflier, tout code publié sur StackOverflow est un fichier creative commons: http: //meta.stackexchange.com/questions/12527/do-i-have-to-worry-about-copyright-issues-for-code-posted-on-stack-overflow –
@Zamboni Y at-il une raison particulière pour laquelle votre convertisseur ignore la «valeur» et effectue la conversion utilisant uniquement le 'paramètre'? Cela semble atypique des convertisseurs. –