Hoe gebruik ik standaard Windows-waarschuwings-/foutpictogrammen in mijn WPF-app?

Ik maak een aangepast foutdialoogvenster in mijn WPF-app en ik wil een standaard Windows-foutpictogram. Kan ik het OS-specifieke pictogram van WPF krijgen? Zo niet, weet iemand waar je .pngs kunt krijgen met transparantie ervan? Of weet u waar u ze in Windows vandaan moet halen?

Tot nu toe hebben mijn zoekopdrachten niets opgeleverd.


Antwoord 1, autoriteit 100%

Er is een SystemIcons-klasse, maar aanpassing nodig voor WPF-behoeften (dwz het converteren van Iconnaar ImageSource).


Antwoord 2, autoriteit 71%

De overgrote meerderheid van de ontwikkelaars weet niet dat Visual Studio wordt geleverd met een afbeeldingenbibliotheek. Dus hier volgen twee links die het benadrukken:

Over het gebruik van Microsoft Visual Studio 2008 Image Library.


Antwoord 3, autoriteit 59%

Zo heb ik een systeempictogram in XAML gebruikt:

xmlns:draw="clr-namespace:System.Drawing;assembly=System.Drawing"
...
<Image Source="{Binding Source={x:Static draw:SystemIcons.Warning},
        Converter={StaticResource IconToImageSourceConverter},
        Mode=OneWay}" />

Ik heb deze converter gebruikt om een ​​pictogram om te zetten in ImageSource:

public class IconToImageSourceConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var icon = value as Icon;
        if (icon == null)
        {
            Trace.TraceWarning("Attempted to convert {0} instead of Icon object in IconToImageSourceConverter", value);
            return null;
        }
        ImageSource imageSource = Imaging.CreateBitmapSourceFromHIcon(
            icon.Handle,
            Int32Rect.Empty,
            BitmapSizeOptions.FromEmptyOptions());
        return imageSource;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Antwoord 4, autoriteit 15%

Gebruik in Visual Studio Bestand + Open + Bestand en selecteer c:\windows\system32\user32.dll. Open de Icon node en dubbelklik op 103. Op mijn computer is dat het Error icoon. Terug, klik er met de rechtermuisknop op en selecteer Exporteren om het in een bestand op te slaan.

Dat is de twijfelachtige manier. Deze pictogrammen zijn ook beschikbaar in Visual Studio. Navigeer vanuit uw Visual Studio-installatiemap naar Common7\VS2008ImageLibrary\xxxx\VS2008ImageLibrary.zip + VS2008ImageLibrary\Annotations&Buttons\ico_format\WinVista\error.ico. Het redist.txt-bestand in de Visual Studio-installatie geeft u expliciet het recht om dit pictogram in uw eigen toepassing te gebruiken.


Antwoord 5, autoriteit 10%

Gebruik dit:

using System;
using System.Drawing;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Markup;
using System.Windows.Media.Imaging;
using Extensions
{
    [ContentProperty("Icon")]
    public class ImageSourceFromIconExtension : MarkupExtension
    {
        public Icon Icon { get; set; }
        public ImageSourceFromIconExtension()
        {
        }
        public ImageSourceFromIconExtension(Icon icon)
        {
            Icon = icon;
        }
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return Imaging.CreateBitmapSourceFromHIcon(Icon.Handle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
        }
    }
}

Vergeet niet om een ​​System.Drawing-referentie toe te voegen aan uw project vanaf de wereldwijde locatie.

Gebruik dit dan in je xaml:

<WindowOrSomething x:Class="BlaBlaWindow"
    xmlns:draw="clr-namespace:System.Drawing;assembly=System.Drawing"
    xmlns:ext="clr-namespace:Extensions">
    <Image Source="{ext:ImageSourceFromIcon {x:Static draw:SystemIcons.Error}}"/>
</WindowOrSomething>

Antwoord 6, autoriteit 10%

Je kunt de klasse SystemIcons van .NET gebruiken voor ongeveer de eerste drie stappen als de standaardgrootte in orde is, zie modosansreves antwoord

Het kan dus zo simpel zijn als:

Imaging.CreateBitmapSourceFromHIcon(SystemIcons.Error.Handle)

Antwoord 7, autoriteit 5%

Kun je niet gewoon Windows API gebruiken?

Delphi-voorbeeld:

procedure TForm1.FormClick(Sender: TObject);
var
  errIcon: HICON;
begin
  errIcon := LoadIcon(0, IDI_ERROR);
  DrawIcon(Canvas.Handle, 10, 10, errIcon)
end;

Antwoord 8

Je kunt het als volgt tekenen:

Graphics g = this.CreateGraphics();
g.DrawIcon(SystemIcons.Question, 40, 40);

Antwoord 9

gebruik SystemIconsen converteer ze naar een ImageSourcezoals:

try   
{
    var temp = SystemIcons.WinLogo.ToBitmap();  //Your icon here
    BitmapImage bitmapImage = new BitmapImage();
    using (MemoryStream memory = new MemoryStream())
    {
       temp.Save(memory, ImageFormat.Png);
       memory.Position = 0;
       bitmapImage.BeginInit();
       bitmapImage.StreamSource = memory;
       bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
       bitmapImage.EndInit();
    }
    this.Icon = bitmapImage;
}
catch (Exception ex)
{
    this.Icon = null;
}

Antwoord 10

Converteer SystemIcons.Error enz. naar .png (behoudt de transparantie) voeg vervolgens uitvoer toe aan bronnen en gebruik het zoals gebruikelijk in WPF Image control.

   System.Drawing.SystemIcons.Error.ToBitmap().Save("Error.png", System.Drawing.Imaging.ImageFormat.Png);

Other episodes