私はWPFアプリでカスタムエラーダイアログを作成していますが、 標準のWindowsエラーアイコン を使用したいです。 WPFからOS固有のアイコンを取得できますか?そうでない場合、誰もが透明な.pngを入手できる場所を知っていますか?または、Windowsのどこから抽出するかを知っていますか?
これまでのところ、私の検索では何も見つかりませんでした。
SystemIcons クラスがありますが、WPFのニーズに合わせて調整する必要があります(つまり、Icon
をImageSource
に変換します)。
標準Microsoftアイコン の使用について。
大部分の開発者は、Visual Studioに画像ライブラリが付属していることを知りません。そこで、それを強調する2つのリンクを紹介します。
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();
}
}
Visual Studioで、File + Open + Fileを使用して、c:\ windows\system32\user32.dllを選択します。アイコンノードを開き、103をダブルクリックします。私のマシンでは、エラーアイコンです。戻る、それを右クリックし、エクスポートを選択してファイルに保存します。
それが不確かな方法です。これらのアイコンはVisual Studioでも使用できます。 Visual Studioのインストールディレクトリから、Common7\VS2008ImageLibrary\xxxx\VS2008ImageLibrary.Zip + VS2008ImageLibrary\Annotations&Buttons\ico_format\WinVista\error.icoに移動します。 Visual Studioインストールのredist.txtファイルは、明示的に、このアイコンを独自のアプリケーションで使用する権利を明示的に与えます。
デフォルトのサイズがOKであれば、おおよそ最初の3つのステップで.NETのSystemIconsクラスを使用できます。 modosansreves answer を参照してください
したがって、次のように簡単になります。
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;
SystemIcons.Errorなどを.png(透明度を維持)に変換してから、リソースに出力を追加し、WPF Imageコントロールで通常どおり使用します。
System.Drawing.SystemIcons.Error.ToBitmap().Save("Error.png", System.Drawing.Imaging.ImageFormat.Png);
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;
}
次のように描くことができます:
Graphics g = this.CreateGraphics();
g.DrawIcon(SystemIcons.Question, 40, 40);