Как использовать стандартные значки предупреждений / ошибок 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 прямо дает вам право использовать этот значок в вашем собственном приложении.

Вы можете использовать класс.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);
Другие вопросы по тегам