Как использовать стандартные значки предупреждений / ошибок Windows в моем приложении WPF?
Я делаю собственный диалог ошибок в своем приложении WPF и хочу использовать стандартный значок ошибки Windows. Могу ли я получить значок для ОС из WPF? Если нет, кто-нибудь знает, где взять.pngs с их прозрачностью? Или знаете, где в Windows их извлечь?
Пока что мои поиски ничего не дали.
10 ответов
Существует класс SystemIcons, но он нуждается в корректировке для нужд WPF (т.е. Icon
в ImageSource
).
Об использовании стандартных значков Microsoft.
Подавляющее большинство разработчиков не знают, что Visual Studio поставляется с библиотекой изображений. Итак, вот две ссылки, которые выделяют это:
Об использовании библиотеки изображений Microsoft Visual Studio 2010.
Об использовании библиотеки изображений Microsoft Visual Studio 2008.
Вот как я использовал системный значок в XAML:
xmlns:draw="clr-namespace:System.Drawing;assembly=System.Drawing"
...
<Image Source="{Binding Source={x:Static draw:SystemIcons.Warning},
Converter={StaticResource IconToImageSourceConverter},
Mode=OneWay}" />
Я использовал этот конвертер, чтобы превратить Icon в 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();
}
}
В Visual Studio используйте Файл + Открыть + Файл и выберите c:\windows\system32\user32.dll. Откройте узел Icon и дважды щелкните 103. На моем компьютере это значок ошибки. Назад, щелкните его правой кнопкой мыши и выберите "Экспорт", чтобы сохранить его в файл.
Это ненадежный способ. Эти значки также доступны в Visual Studio. В каталоге установки Visual Studio перейдите к папке Common7\VS2008ImageLibrary\xxxx\VS2008ImageLibrary.zip + VS2008ImageLibrary\ Аннотации и кнопки \ico_format\WinVista\error.ico. Файл redist.txt в установке Visual Studio прямо дает вам право использовать этот значок в вашем собственном приложении.
- p / invload LoadImage с OIC_ERROR ( доступны другие значки, но вы хотели значок ошибки / остановки), вам нужен флаг LR_SHARED.
- Если вы хотите другой размер, p/invoke CopyImage
- Вызовите System.Drawing.Icon.FromHandle с IntPtr, полученным из LoadImage
- Для GDI+ нарисуйте свой Drawing.Icon или клонируйте его для дальнейшего использования.
- Для WPF, превратите его в BitmapSource
- p/invoke DestroyIcon, если вы использовали CopyImage
Вы можете использовать класс.NET SystemIcons примерно для первых трех шагов, если размер по умолчанию в порядке, см. Ответ modosansreves.
Так что это может быть так просто, как:
Imaging.CreateBitmapSourceFromHIcon(SystemIcons.Error.Handle)
Использовать этот:
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());
}
}
}
Не забудьте добавить ссылку System.Drawing на ваш проект из глобального местоположения.
Затем используйте это в вашем 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>
Разве вы не можете просто использовать Windows API?
Пример Delphi:
procedure TForm1.FormClick(Sender: TObject);
var
errIcon: HICON;
begin
errIcon := LoadIcon(0, IDI_ERROR);
DrawIcon(Canvas.Handle, 10, 10, errIcon)
end;
Вы можете нарисовать это так:
Graphics g = this.CreateGraphics();
g.DrawIcon(SystemIcons.Question, 40, 40);
Использование SystemIcons
и преобразовать их в ImageSource
вот так:
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;
}
Преобразуйте SystemIcons.Error и т. Д. В.png (поддерживает прозрачность), затем добавьте выходные данные к ресурсам и, как обычно, используйте для управления изображениями WPF.
System.Drawing.SystemIcons.Error.ToBitmap().Save("Error.png", System.Drawing.Imaging.ImageFormat.Png);