コードで 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" />
ベストアンサー1
あなたと同じ問題を抱えて、いろいろ調べた結果、解決策を見つけました -パック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 つ以上の参照アセンブリが読み込まれるときに使用されます。
- ;component: 参照されるアセンブリがローカル アセンブリから参照されることを指定します。
- /Path: 参照アセンブリのプロジェクト フォルダーのルートを基準としたリソース ファイルの名前 (パスを含む)。
後ろの 3 つのスラッシュはapplication:
コンマに置き換える必要があります。
注: パック URI の権限コンポーネントは、パッケージを指す埋め込み URI であり、RFC 2396 に準拠している必要があります。また、「/」文字は「,」文字に置き換え、「%」や「?」などの予約文字はエスケープする必要があります。詳細については、OPC を参照してください。
もちろん、イメージのビルドアクションを に設定してくださいResource
。