Wie bekomme ich ein Bild, das für die verschiedenen MessageBoxImage(s) oder MessageBoxIcon(s)

StackOverflow https://stackoverflow.com/questions/1309738

  •  19-09-2019
  •  | 
  •  

Frage

Wie bekomme ich eine System.Drawing.Image für die verschiedenen System.Windows.MessageBoxImage(s) und/oder System.Windows.Forms.MessageBoxIcon(s)

War es hilfreich?

Lösung

SystemIcons ist das, was ich gesucht habe:

SystemIcons.Warning.ToBitmap();

Andere Tipps

Sie können auch SystemIcons in XAML sind wie folgt:

Fügen Sie einen Konverter (siehe Code unten) als Ressource, und eine Bildsteuerung in XAML. Dieses Bild Beispiel hier zeigt das Informationssymbol.

     <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}"/>

Hier ist die Implementierung für den Konverter:

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();
      }
   }
}

Wie andere angegeben haben SystemIcons ist die Klasse, die sollte enthalten die Symbole, aber unter Windows 8.1 (und möglicherweise auf frühere Versionen) der Symbole vorhanden, die in der SystemIcons unterscheiden sich von denen, die angezeigt, auf der MessageBoxes im Fall von Sternchen, Informationen und Fragen.Die Symbole auf den dialog-look viel schmeicheln.Sehen Sie sich zum Beispiel die Frage, Symbol:

Question icon

Das Symbol im dialog ist die native Dialogfeld, Symbol, und die am weitesten Links stehende Symbol auf dem Formular im hintergrund ist das Symbol stammt aus der SystemIcons Klasse.

Für verschiedene Methoden, und die details auf, wie man das Symbol aus der MessageBox sehen diese Antwort, aber habe ich auch hier eine kurze Zusammenfassung, nur der Vollständigkeit halber:

Sollten Sie die SHGetStockIconInfo Funktion:

 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();

Bitte Hinweis:

Wenn diese Funktion gibt ein Symbol, Griff in die hIcon Mitglied der SHSTOCKICONINFO Struktur Spitzen, von psii, für die Sie verantwortlich sind befreien Sie das Symbol mit DestroyIcon wenn Sie es nicht mehr benötigen.

Natürlich, für diese zu arbeiten, Sie wird haben zu definieren, der ein paar enums und structs:

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);
MessageBox.Show(
  "Hello, world!",
  "My App",
  MessageBoxButton.OK, MessageBoxImage.Information);

So einfach wie das.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top