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 Icon
naar 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%
- p/invoke LoadImagemet de OIC_ERROR (andere pictogrammen beschikbaar, maar u het fout/stop-pictogram wilde hebben), heeft u de vlag LR_SHARED nodig.
- Als je een ander formaat wilt, p/invoke Afbeelding kopiëren
- Bel Systeem .Drawing.Icon.FromHandlemet de IntPtr die je hebt gekregen van LoadImage
- Voor GDI+, Teken uw Drawing.Iconof Kloon het voor later gebruik.
- Voor WPF, verander het in een BitmapSource
- p/invoke DestroyIconals je CopyImage gebruikt
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 SystemIcons
en converteer ze naar een ImageSource
zoals:
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);