私のアセンブリには、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を使用するまで待つことでした。
このMSDNページ には、WPFのリソースURI(多くの場合、パックURIと呼ばれる)について知りたい情報がすべて含まれています。 相対URIをより頻繁に使用したいので、表4を参照してください。特に使用する必要があります。
リソース(パック)URIの簡単な概要が必要な場合は、 このブログ投稿 を参照してください。これは、構文が実際に比較的単純であることを示しています。
pack://application:,,,/ResourceFile.xaml
pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml
ただし、(私の経験では)解決すべきいくつかの癖があるため、多くの場合、正しいリソースURIを見つけるには少し実験が必要です。