WPFでバイナリリソースを取得する場合、いくつかの異なるオプションがあり、それらはすべて、必要な動作の種類によって異なります。
リソースをアセンブリ内に埋め込む必要がある場合は、それらをVisual Studioのプロジェクトに追加し、ビルドアクションを[リソース]に設定します。このように、それらはアセンブリにベイク処理されるため、簡単に変更することはできません。
それらをルーズファイルとして残す必要がある場合は、それらをプロジェクトに追加し、ビルドアクションをコンテンツに設定します。また、それらが出力ディレクトリにコピーされていることを確認してください。頻繁に交換する必要があり、毎回アセンブリを再コンパイルする必要がない場合は、これをお勧めします。
それらをルーズファイルとして使用したいが、何らかの理由でVisual Studioソリューションに含めたくない場合(コンパイル時に認識されていない可能性があります)、フルパスまたはSiteOfOrigin表記と呼ばれるものを使用してアクセスできます。あなたの場合は関係ないので、これについては説明しません。
コードからリソースにアクセスするには、さまざまな形式のパックURIを使用します。
pack://application:,,,/img.jpg
プロジェクトのルートにある画像を参照します。
pack://application:,,,/Folder1/Folder2/img.jpg
プロジェクトのサブフォルダー内の画像を参照します。
pack://application:,,,/NameOfDll;Component/img.jpg
VisualStudioに参照がある別のアセンブリの画像を参照します。
幸い、リソースがXAMLから参照される場合、完全なURIを記述する必要はありません。
場所の一部を完全なURIに変換できるTypeConverterが存在するため、基本的にそのpack://application:,,,
部分を回避できます。
上記のポイント1と2では、実行時にアセンブリと一緒にルーズファイルとして存在するか、アセンブリ内に埋め込まれているかに関係なく、同じXAMLを使用してリソースを参照します。
ただし、手続き型コードからリソースを参照する場合は、完全に定義された明示的なURIを使用する必要があります。
これがどのように機能するかを示すために、いくつかのコードを記述し、いくつかの画像を含めました。

関連するXAML:
<StackPanel>
<TextBlock Text="Embedded in same assembly" />
<Image Source="gift.png" />
</StackPanel>
<StackPanel>
<TextBlock Text="Embedded in same assembly in a subfolder" />
<Image Source="Content/Images/gift.png" />
</StackPanel>
<StackPanel>
<TextBlock Text="Embedded in same assembly in a subfolder using full pack URI format" />
<Image Source="pack://application:,,,/Content/Images/gift.png" />
</StackPanel>
<StackPanel>
<TextBlock Text="Embedded in different assembly" />
<Image Source="/Module1;Component/gift.png" />
</StackPanel>
<StackPanel>
<TextBlock Text="Embedded in different assembly in a subfolder" />
<Image Source="/Module1;Component/Images/gift.png" />
</StackPanel>
<StackPanel>
<TextBlock Text="Embedded in different assembly in a subfolder using full Pack URI format" />
<Image Source="pack://application:,,,/Module1;Component/Images/gift.png" />
</StackPanel>
<StackPanel>
<TextBlock Text="Setting imagesource from code-behind" />
<Image x:Name="image1" />
</StackPanel>
関連するコードビハインド:
public Window1()
{
InitializeComponent();
//Here we have to use the full Pack URI
//image1.Source = new BitmapImage(new Uri("/Module1;Component/Images/gift.png")); //Throws exception..
image1.Source = new BitmapImage(new Uri("pack://application:,,,/Module1;Component/Images/gift.png"));
}
更新リソースがそれを使用しているのと同じアセンブリにある場合、URI
の一部を含める理由はありません。/NameOfDll;Component/
あなたの場合、なぜそれが機能しないのかわかりません。
Module1にウィンドウを追加しました。これは、独自のアセンブリ内の1つの画像を参照するだけで、正常に機能しているようです。WPFアプリケーションでボタンをクリックすると、ウィンドウが表示されます。
<Window x:Class="Module1.WindowTest"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
Title="Window from Module1">
<Grid>
<Image Source="Images/gift.png" />
</Grid>
</Window>
