プログラムのさまざまな部分で簡単に参照および使用できるリソースを作成するにはどうすればよいですか?
私の特定の問題は、プログラムの状態に応じてアイコンを変更したい NotifyIcon があることです。よくある問題ですが、私が長い間苦労してきた問題です。
プログラムのさまざまな部分で簡単に参照および使用できるリソースを作成するにはどうすればよいですか?
私の特定の問題は、プログラムの状態に応じてアイコンを変更したい NotifyIcon があることです。よくある問題ですが、私が長い間苦労してきた問題です。
さて、StackOverflow 周辺のさまざまなポイントを検索してまとめた後 (私はこの場所が大好きです)、ほとんどの問題はすでにこの段階を過ぎていました。しかし、私は自分の問題に対する答えを見つけることができました。
リソースの作成方法:
私の場合、アイコンを作成したいと思います。ただし、リソースとして追加するデータの種類に関係なく、同様のプロセスです。
リソースの使用方法:
新しいリソースができたので、素敵な変化するアイコンが欲しくてうずうずしています...どうすればいいですか?幸運なことに、C# を使用すると、これが非常に簡単になります。
Properties.Resources
すべてのリソースにアクセスできるようにする静的クラスが呼び出されるため、コードは次のように単純になりました。
paused = !paused;
if (paused)
notifyIcon.Icon = Properties.Resources.RedIcon;
else
notifyIcon.Icon = Properties.Resources.GreenIcon;
終わり!終了した!方法がわかれば、すべてが簡単ですよね。
上記は、Visual Studio 2010 で期待していたように、実際には機能しませんでした。Properties.Resources にアクセスできませんでした。権限の問題によりアクセスできないとのことでした。最終的にリソースのプロパティで永続化設定を変更する必要がありましたが、Resources.Designer.cs ファイルを介してリソースにアクセスする方法を見つけました。このファイルには、MyNamespace.Properties.Resources を介してアイコンにアクセスできる自動ゲッターがありました。 .NameFromAddingTheResource. これは、すぐに使用できるアイコン型のオブジェクトを返します。
上記の方法はうまくいきます。
別の方法 (ここでは Web を想定しています) は、ページを作成することです。コントロールをページに追加します。次に、デザイン モードで[ツール] > [ローカル リソースの生成] に移動します。リソース ファイルは、ページ内のすべてのコントロールがリソース ファイルにマップされた状態で、ソリューションに自動的に表示されます。
他の言語のリソースを作成するには、拡張子の前に、ファイル名の末尾に 4 文字の言語を追加します ( Account.aspx.en-US.resx、Account.aspx.es-ES.resx ...など)。
コード ビハインドで特定のエントリを取得するには、次のメソッドを呼び出すだけですGetLocalResourceObject([resource entry key/name])
。
Matthew Scharley によって投稿されたコードには、メモリ リークがあります。
paused = !paused;
if (paused)
notifyIcon.Icon = Properties.Resources.RedIcon;
else
notifyIcon.Icon = Properties.Resources.GreenIcon;
使用するたびに新しいアイコンが作成されるDispose()
ため、置き換える前に Icon.Icon に通知する必要があります。これは、次のコードを使用してログで確認できます。Properties.Resources.SOME_ICON
Icon
Console.WriteLine(Properties.Resources.RedIcon.GetHashCode());
Console.WriteLine(Properties.Resources.RedIcon.GetHashCode());
Console.WriteLine(Properties.Resources.RedIcon.GetHashCode());
ログに 3 つの異なるハッシュ コードが表示されます。これは、これらが異なるオブジェクトであることを意味します。
したがって、簡単な修正は次のようになります。
paused = !paused;
notifyIcon.Icon?.Dispose();
notifyIcon.Icon = paused
? Properties.Resources.RedIcon;
: Properties.Resources.GreenIcon;