Ответ 1
Существует класс SystemIcons, но ему нужна настройка для нужд WPF (например, преобразование Icon
в ImageSource
).
Я создаю настраиваемый диалог ошибок в своем приложении WPF, и я хочу использовать стандартный значок ошибки Windows. Могу ли я получить значок OS-специфики из WPF? Если нет, кто-нибудь знает, где можно получить .pngs с прозрачностью? Или знаете, где в Windows, чтобы извлечь их из?
До сих пор мои поиски ничего не отображали.
Существует класс SystemIcons, но ему нужна настройка для нужд WPF (например, преобразование Icon
в ImageSource
).
Об использовании Стандартные значки Microsoft.
Подавляющее большинство разработчиков там не знают, что Visual Studio поставляется с библиотекой изображений. Итак, вот две ссылки, которые выделяют это:
Об использовании Библиотека изображений Microsoft Visual Studio 2010.
Об использовании Библиотека изображений Microsoft Visual Studio 2008.
В Visual Studio используйте File + Open + File и выберите c:\windows\system32\user32.dll. Откройте значок node и дважды щелкните 103. На моей машине значок ошибки. Щелкните правой кнопкой мыши и выберите "Экспорт", чтобы сохранить его в файле.
Это неудобный способ. Эти значки также доступны в Visual Studio. В установочном каталоге Visual Studio перейдите на Common7\VS2008ImageLibrary\xxxx\VS2008ImageLibrary.zip + VS2008ImageLibrary\Аннотации и кнопки \ico_format\WinVista\error.ico. Файл redist.txt в Visual Studio прямо устанавливает прямое использование этого значка в вашем собственном приложении.
Вот как я использовал значок системы в XAML:
xmlns:draw="clr-namespace:System.Drawing;assembly=System.Drawing"
...
<Image Source="{Binding Source={x:Static draw:SystemIcons.Warning},
Converter={StaticResource IconToImageSourceConverter},
Mode=OneWay}" />
Я использовал этот конвертер, чтобы повернуть значок в 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();
}
}
Вы можете использовать класс .NET SystemIcons примерно для первых трех шагов, если размер по умолчанию одобрен, см. modosansreves answer
Итак, это может быть так просто:
Imaging.CreateBitmapSourceFromHIcon(SystemIcons.Error.Handle)
Не можете ли вы просто использовать Windows API?
Пример Delphi:
procedure TForm1.FormClick(Sender: TObject);
var
errIcon: HICON;
begin
errIcon := LoadIcon(0, IDI_ERROR);
DrawIcon(Canvas.Handle, 10, 10, errIcon)
end;
Используйте это:
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>
Вы можете сделать это следующим образом:
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;
}