web-dev-qa-db-ja.com

WPFアプリで標準のWindows警告/エラーアイコンを使用するにはどうすればよいですか?

私はWPFアプリでカスタムエラーダイアログを作成していますが、 標準のWindowsエラーアイコン を使用したいです。 WPFからOS固有のアイコンを取得できますか?そうでない場合、誰もが透明な.pngを入手できる場所を知っていますか?または、Windowsのどこから抽出するかを知っていますか?

これまでのところ、私の検索では何も見つかりませんでした。

42
RandomEngy

SystemIcons クラスがありますが、WPFのニーズに合わせて調整する必要があります(つまり、IconImageSourceに変換します)。

33

標準Microsoftアイコン の使用について。

大部分の開発者は、Visual Studioに画像ライブラリが付属していることを知りません。そこで、それを強調する2つのリンクを紹介します。

Microsoft Visual Studio 2010 Image Library の使用について。

Microsoft Visual Studio 2008 Image Library の使用について。

29

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();
    }
}
10
run2thesun

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ファイルは、明示的に、このアイコンを独自のアプリケーションで使用する権利を明示的に与えます。

6
Hans Passant

デフォルトのサイズがOKであれば、おおよそ最初の3つのステップで.NETのSystemIconsクラスを使用できます。 modosansreves answer を参照してください

したがって、次のように簡単になります。

 Imaging.CreateBitmapSourceFromHIcon(SystemIcons.Error.Handle)
4
Ben Voigt

これを使って:

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>
2
DileriumL

単純にWindows APIを使用することはできませんか?

Delphiの例:

procedure TForm1.FormClick(Sender: TObject);
var
  errIcon: HICON;
begin
  errIcon := LoadIcon(0, IDI_ERROR);
  DrawIcon(Canvas.Handle, 10, 10, errIcon)
end;
1

SystemIcons.Errorなどを.png(透明度を維持)に変換してから、リソースに出力を追加し、WPF Imageコントロールで通常どおり使用します。

    System.Drawing.SystemIcons.Error.ToBitmap().Save("Error.png", System.Drawing.Imaging.ImageFormat.Png);
0
David Coleman

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;
}
0
user1

次のように描くことができます:

Graphics g = this.CreateGraphics();
g.DrawIcon(SystemIcons.Question, 40, 40);
0
Hun1Ahpu