web-dev-qa-db-ja.com

リソースからBitmapImageを取得するにはどうすればよいですか?

私のアセンブリには、BuildAction == Resourceの画像が含まれています。この埋め込みリソースからBitmapImageを取得したい。

このようなファイルからBitmapImageをロードできます。

var bitmap = new BitmapImage(new Uri(path));

しかし、埋め込みリソースイメージを参照するUriを作成するにはどうすればよいですか?

' pack URI '(たとえば、pack://application:,,,/MyImage.pngまたはpack://application:,,,/MyAssembly;component/MyImage.png)を作成しようとすると、例外がスローされます。

System.UriFormatException "無効なURI:コロン( ':')が存在するためポートが必要でしたが、ポートを解析できませんでした。"

この中のUriFormatExceptionに対する修正を見つけました ブログ投稿

ただし、その修正を適用しても、パックURIからBitmapImageを読み込もうとすると例外が発生します。

pack://application:,,,/Image.png形式を使用すると、NullReferenceExceptionが発生し、pack://application:,,,/AssemblyName;component/Image.png形式を使用すると、「Uriプレフィックスが認識されません」というNotSupportedExceptionが発生します。


概要私の問題は、WPFコントロール/ウィンドウ/などがインスタンス化される前にプロセスで「パックURI」を使用しようとしていたことでした。 'pack' URIスキームはまだ登録されていません(パックスキームを手動で登録しても問題は解決されないため、他のWPFに必要な 'stuff'も設定しないでください)。解決策は、WPFユーザーコントロールをインスタンス化してからパックURIを使用するまで待つことでした。

34
mackenir

このMSDNページ には、WPFのリソースURI(多くの場合、パックURIと呼ばれる)について知りたい情報がすべて含まれています。 相対URIをより頻繁に使用したいので、表4を参照してください。特に使用する必要があります。

リソース(パック)URIの簡単な概要が必要な場合は、 このブログ投稿 を参照してください。これは、構文が実際に比較的単純であることを示しています。

pack://application:,,,/ResourceFile.xaml

pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml

ただし、(私の経験では)解決すべきいくつかの癖があるため、多くの場合、正しいリソースURIを見つけるには少し実験が必要です。

20
Noldorin