1. ホーム
  2. c#

[解決済み】WPFの画像ソースをコードで設定する

2022-04-14 22:17:51

質問

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 .