web-dev-qa-db-ja.com

WPFのリソースであるアイコンを使用するにはどうすればよいですか?

リソースとして埋め込まれた.icoファイルがあります(ビルドアクションがリソースに設定されています)。 NotifyIconを作成しようとしています。アイコンを参照するにはどうすればよいですか?

notifyIcon = new NotifyIcon();
notifyIcon.Icon = ??     // my icon file is called MyIcon.ico and is embedded
64
ScottG

アイコンファイルをプロジェクトアセンブリの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 );
100
user13125

一般的な使用パターンは、通知アイコンをメインウィンドウのアイコンと同じにすることです。アイコンは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">
20
Thomas Bratt

さて、resxスタイルのリソースは使いたくありません。プロジェクトのicoファイルをフォルダー(「ArtWork」と言います)に貼り付け、プロパティでビルドアクションを「Resources」に設定します...

次に、PACK URI ... "pack:// application:,/Artwork/Notify.ico"を使用してXAMLで参照できます。

こちらをご覧ください: http://msdn.Microsoft.com/en-us/library/aa970069.aspx および sample

もう少し... WPFのようになりたい場合は、XAMLで作成でき、標準のWPFメニューを使用するNotifyIconコントロールを持つCodePlexの WPF Contrib プロジェクトを調べる必要があります。 (したがって、メニューに「何でも」貼り付けることができます)。

12
Jaykul

単純な答えを探しているだけなら、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">
2
Mike Sage

ここでプロジェクトを作成し、埋め込みリソースを使用しました(ビルドアクションは、単なるリソースではなく埋め込みリソースに設定されました)。このソリューションはリソースでは機能しませんが、操作できる場合があります。 OnIntialized()にこれを置きましたが、そこに行く必要はありません。

//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;
    }
1
blackSphere