Comment obtenir une Image pour les différents MessageBoxImage (s) ou MessageBoxIcon(s))
Comment puis-je obtenir un Système.Dessin.Image pour les différents systèmes.Windows.MessageBoxImage (s) et/ou Système.Windows.Forme.MessageBoxIcon (s)
3 réponses
SystemIcons est ce que je recherche:
SystemIcons.Warning.ToBitmap();
incluez un convertisseur (voir code ci-dessous) comme ressource, et un contrôle D'Image dans votre 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}"/>
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 l'ont dit SystemIcons
est la classe qui devrait contenir ces icônes, mais sur Windows 8.1 (et peut-être aussi sur les versions précédentes) les icônes présentes dans le SystemIcons
différer de ceux affichés sur le MessageBoxes
dans le cas d'un astérisque, Information et Question. Les icônes sur le dialogue semblent beaucoup flatter. Voir - par exemple-l'icône Question:
L'icône dans la boîte de dialogue est dialogue native de l'icône, et le plus à gauche l'icône sur le formulaire en arrière-plan est l'icône extraite du SystemIcons
classe.
pour les différentes méthodes et les détails sur la façon d'obtenir l'icône à partir de la boîte de messagerie voir ceci réponse, mais je l'inclus ici un résumé rapide, juste pour le plaisir de l'exhaustivité:
Vous devez utiliser le SHGetStockIconInfo
fonction:
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();
Merci remarque::
si cette fonction renvoie une poignée d'icône dans le hIcon membre de la SHSTOCKICONINFO structure pointée par psii, vous êtes responsable en libérant l'icône DestroyIcon lorsque vous n'en avez plus besoin.
bien sûr, pour que cela fonctionne, vous devrez définir quelques énums et structures:
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);