[解決済み】WPFの画像ソースをコードで設定する
質問
WPFの画像のソースをコードで設定しようとしています。画像はプロジェクトにリソースとして埋め込まれています。例を見て、私は以下のコードを思いつきました。なぜかうまくいきません - 画像が表示されないのです。
デバッグをすると、ストリームに画像データが含まれていることがわかります。では、何が問題なのでしょうか?
Assembly asm = Assembly.GetExecutingAssembly();
Stream iconStream = asm.GetManifestResourceStream("SomeImage.png");
PngBitmapDecoder iconDecoder = new PngBitmapDecoder(iconStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
ImageSource iconSource = iconDecoder.Frames[0];
_icon.Source = iconSource;
アイコンはこのように定義されています。
<Image x:Name="_icon" Width="16" Height="16" />
解決方法は?
あなたと同じ問題を抱え、いくつかの本を読んだ後、私は解決策を発見しました。 パックURI .
コードで以下のようにしました。
Image finalImage = new Image();
finalImage.Width = 80;
...
BitmapImage logo = new BitmapImage();
logo.BeginInit();
logo.UriSource = new Uri("pack://application:,,,/AssemblyName;component/Resources/logo.png");
logo.EndInit();
...
finalImage.Source = logo;
あるいは、別のBitmapImageコンストラクタを使用することで、より短くすることができます。
finalImage.Source = new BitmapImage(
new Uri("pack://application:,,,/AssemblyName;component/Resources/logo.png"));
URIをパーツに分解しています。
-
オーソリティ
application:///
-
パス。参照されるアセンブリにコンパイルされるリソースファイルの名前。パスは以下の形式に準拠する必要があります。
AssemblyShortName[;Version][;PublicKey];component/Path
- AssemblyShortName: 参照されるアセンブリの短縮名。
- ;バージョン [オプション]: リソースファイルを含む参照されるアセンブリのバージョン。これは、同じ短い名前を持つ2つ以上の参照されるアセンブリがロードされるときに使用されます。
- ;PublicKey [オプション]: 参照されるアセンブリに署名するために使用された公開鍵です。これは、同じ短い名前を持つ 2 つ以上の参照されるアセンブリがロードされるときに使用されます。
- ;コンポーネント:参照されているアセンブリがローカルアセンブリから参照されていることを指定します。
- /Path: 参照されるアセンブリのプロジェクトフォルダーのルートからの相対パスを含むリソースファイルの名前。
の後にある3つのスラッシュは
application:
はカンマに置き換えなければなりません。
注:パックURIのオーソリティ・コンポーネントである を指し示す埋め込みURIです。 パッケージで、RFC2396に準拠する必要があります。 また、"/"文字は、RFC2396に準拠する必要があります。 は、"," 文字に置き換えてください。 といった予約文字があります。 や "?" などの予約文字は、エスケープする必要があります。OPC をご覧ください。
そしてもちろん、イメージのビルドアクションを必ず
Resource
.
関連
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み] div' コンテナに合わせて画像を自動リサイズするにはどうしたらいいですか?
-
[解決済み] div 内の画像を縦に並べる方法
-
[解決済み] Try-catchは私のコードをスピードアップさせるか?
-
[解決済み] Markdownで画像サイズを変更する
-
[解決済み] Bitmapオブジェクトに画像を読み込む際にOutOfMemoryが発生する問題
-
[解決済み] WPFアプリケーションをプログラムで終了させるには?
-
[解決済み] WPF画像リソースの保存
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] 1つ以上のエンティティで検証に失敗しました。詳細は'EntityValidationErrors'プロパティを参照してください [重複]。
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない