web-dev-qa-db-fra.com

Comment utiliser les icônes d'avertissement/d'erreur Windows standard dans mon application WPF?

Je crée une boîte de dialogue d'erreur personnalisée dans mon application WPF et souhaite utiliser une icône d'erreur standard de Windows . Puis-je obtenir l’icône spécifique au système d’exploitation de WPF? Si non, est-ce que quelqu'un sait où obtenir des fichiers .pngs transparents? Ou savez-vous où extraire Windows?

Jusqu'à présent, mes recherches n'ont abouti à rien.

40
RandomEngy

Il existe une classe SystemIcons , mais elle doit être adaptée aux besoins de WPF (c'est-à-dire convertir Icon en ImageSource).

33
bohdan_trotsenko

À propos de l'utilisation de Icônes Microsoft standard .

La grande majorité des développeurs ne savent pas que Visual Studio est fourni avec une bibliothèque d'images. Alors voici deux liens qui le soulignent:

À propos de l'utilisation de Bibliothèque d'images Microsoft Visual Studio 2010 .

À propos de l'utilisation de Bibliothèque d'images Microsoft Visual Studio 2008 .

29

Voici comment j'ai utilisé une icône système dans XAML:

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

J'ai utilisé ce convertisseur pour transformer une icône en 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();
    }
}
8
run2thesun

Dans Visual Studio, utilisez Fichier + Ouvrir + Fichier et sélectionnez c:\windows\system32\user32.dll. Ouvrez le nœud Icône et double-cliquez sur 103. Sur mon ordinateur, l'icône d'erreur. Retour, cliquez dessus avec le bouton droit de la souris et sélectionnez Exporter pour l’enregistrer dans un fichier.

C'est la mauvaise façon. Ces icônes sont également disponibles dans Visual Studio. Depuis votre répertoire d'installation Visual Studio, accédez à Common7\VS2008ImageLibrary\xxxx\VS2008ImageLibrary.Zip + VS2008ImageLibrary\Annotations & Buttons\ico_format\WinVista\error.ico. Le fichier redist.txt de l'installation de Visual Studio vous donne explicitement le droit d'utiliser cette icône dans votre propre application.

6
Hans Passant

Vous pouvez utiliser la classe SystemIcons .NET pour les trois premières étapes environ si la taille par défaut est ok, voir modosansreves answer

Donc, cela pourrait être aussi simple que:

 Imaging.CreateBitmapSourceFromHIcon(SystemIcons.Error.Handle)
4
Ben Voigt

Utilisez ceci:

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

N'oubliez pas d'ajouter une référence System.Drawing à votre projet à partir d'un emplacement global.

Ensuite, utilisez ceci dans votre 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>
2
DileriumL

Ne pouvez-vous pas simplement utiliser l'API Windows?

Exemple Delphi:

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

Convertissez SystemIcons.Error, etc. au format .png (conserve la transparence), puis ajoutez la sortie aux ressources et utilisez-la comme d'habitude dans le contrôle Image WPF.

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

utilisez SystemIcons et convertissez-les en ImageSource comme ceci:

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;
}
0
user1

Vous pouvez le dessiner comme ceci:

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