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.
Il existe une classe SystemIcons , mais elle doit être adaptée aux besoins de WPF (c'est-à-dire convertir Icon
en ImageSource
).
À 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 .
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();
}
}
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.
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)
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>
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;
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);
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;
}
Vous pouvez le dessiner comme ceci:
Graphics g = this.CreateGraphics();
g.DrawIcon(SystemIcons.Question, 40, 40);