WP TIPS に戻る

ビルドアクション リソース/コンテンツ URI の指定方法

ビルドアクションについて

Visual Studio や Expression Blend で画像などのデータをプロジェクトに追加すると、プログラムと一緒にデバイスやエミュレータに配置することが出来ます。
この時 Visual Studio でデータのビルドアクションを指定し、どのように配置をするのか指定することが出来ます。

buildaction-01.jpg

ビルドアクションは色々選択できますが、有効なのは "Resource"・"コンテンツ" の2種類だけ(?) で、それぞれデータの格納方式とデータの呼び出し方が異なります。

種類内容
Resourceアセンブリ内のリソースとして格納される
コンテンツアセンブリとは別のファイルとして格納される

データの読み込み方法について

では今度はデータの読み込み方法についてです。
プロジェクトで、01.jpg は "Resoruce"、02.jpg は "コンテンツ" でビルドした物とします。
この2つのデータを読み込むのが以下のコードです。

buildaction-02.jpg

コンテンツ読み込みは、Visual Studio プロジェクト内のフォルダ構成と同じ URI になるので、分かりやすいかと思います。
Resource の方は、同一アセンブリ内のリソースを読み込む場合は、プロジェクト内にあるパスに ..\ を付けるだけで読み込みが出来ます。
次に他のアセンブリ内(=別の DLL など) に格納されている画像などを読み込む場合は、URI の先頭にアセンブリ名(この場合は ReadContents) と component というプリフィックスを付けてあげます。

※アセンブリ名は、プロジェクトプロパティの「アセンブリ名」になります。

private void button1_Click(object sender, RoutedEventArgs e)
{
    // 同一アセンブリ内の Resource の読み込み
    this.image1.Source = new BitmapImage(new Uri(@"..\Image\01.jpg", UriKind.Relative));

    // 他のアセンブリ内の Resource の読み込み
    this.image1.Source = new BitmapImage(new Uri(@"/ReadContents;component/Image/01.jpg", UriKind.Relative));
}

private void button2_Click(object sender, RoutedEventArgs e)
{
    // コンテンツの読み込み
    this.image1.Source = new BitmapImage(new Uri("Image/02.jpg", UriKind.Relative));
}

リソースとコンテンツどちらが良いの?

基本的にはビルドアクションは "コンテンツ" で良いかと思います。
というのも "Resource" にすると DLL 等のコードと一緒にビルドされるので、アセンブリのロードに多少時間がかかるようになります。
※詳しくベンチマークを取ってないですけれども、大量のデータになればアプリの起動時間が遅くなるかと。

"Resource" でビルドする場合は DLL を配布する場合など、コンテンツも含めて同一ファイルにしたい場合などと、メニューバーのアイコンに使用する場合だけだと思われます。

メニューバーのアイコンについては、以下のページの最後を参照して下さい。
ApplicationBar のコマンド実装・バインディングとメニューを動的に変更する