WPF でリソースであるアイコンを使用するにはどうすればよいですか?
質問
リソースとして埋め込まれた .ico ファイルがあります (ビルド アクションがリソースに設定されています)。NotifyIconを作成しようとしています。自分のアイコンを参照するにはどうすればよいですか?
notifyIcon = new NotifyIcon();
notifyIcon.Icon = ?? // my icon file is called MyIcon.ico and is embedded
解決
アイコン ファイルをプロジェクト アセンブリの 1 つに追加し、そのビルド アクションをリソースに設定する必要があります。アセンブリへの参照を追加した後、次のような NotifyIcon を作成できます。
System.Windows.Forms.NotifyIcon icon = new System.Windows.Forms.NotifyIcon();
Stream iconStream = Application.GetResourceStream( new Uri( "pack://application:,,,/YourReferencedAssembly;component/YourPossibleSubFolder/YourResourceFile.ico" )).Stream;
icon.Icon = new System.Drawing.Icon( iconStream );
他のヒント
一般的な使用パターンは、通知アイコンをメイン ウィンドウのアイコンと同じにすることです。アイコンは PNG ファイルとして定義されます。
これを行うには、画像をプロジェクトのリソースに追加し、次のように使用します。
var iconHandle = MyNamespace.Properties.Resources.MyImage.GetHicon();
this.notifyIcon.Icon = System.Drawing.Icon.FromHandle(iconHandle);
XAML ウィンドウで次のようにします。
<Window x:Class="MyNamespace.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:local="clr-namespace:Seahorse"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="600"
Icon="images\MyImage.png">
さて、あなたは resx スタイルのリソースを使用したくないでしょう。プロジェクトの ico ファイルをフォルダー (「ArtWork」としましょう) に貼り付け、プロパティでビルド アクションを「リソース」に設定するだけです。
その後、PACK URI を使用して XAML でそれを参照できます。「pack://application:,,,/Artwork/Notify.ico」
ここを参照してください: http://msdn.microsoft.com/en-us/library/aa970069.aspx そしてその サンプル
もう少しなりたいなら…WPF と同様に、次のことを調べてください。 WPF投稿者 CodePlex 上のプロジェクトには、XAML で作成でき、標準の WPF メニューを使用する NotifyIcon コントロールがあります (そのため、メニューに「何でも」貼り付けることができます)。
単純な答えを探しているだけであれば、MyApp がアプリケーション名で、それがアプリケーションのルート名前空間名であると考えられます。パック URI 構文を使用する必要がありますが、埋め込みリソースからアイコンを取得するのはそれほど複雑である必要はありません。
<Window x:Class="MyApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Height="100"
Width="200"
Icon="pack://application:,,,/MyApp;component/Resources/small_icon.ico">
ここでプロジェクトを作成し、埋め込みリソースを使用しました (ビルド アクションは単なるリソースではなく、埋め込みリソースに設定されました)。この解決策はリソースでは機能しませんが、操作できる可能性があります。これを OnInialized() に置きましたが、そこに置く必要はありません。
//IconTest = namespace; exclamic.ico = resource
System.IO.Stream stream = this.GetType().Assembly.GetManifestResourceStream("IconTest.Resources.exclamic.ico");
if (stream != null)
{
//Decode the icon from the stream and set the first frame to the BitmapSource
BitmapDecoder decoder = IconBitmapDecoder.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.None);
BitmapSource source = decoder.Frames[0];
//set the source of your image
image.Source = source;
}