#setlinebreak(on);

[[WP TIPS に戻る>wp7/tips]]
*ビルドアクション リソース/コンテンツ URI の指定方法 [#cac03fea]
**ビルドアクションについて [#y6f1a37f]
Visual Studio や Expression Blend で画像などのデータをプロジェクトに追加すると、プログラムと一緒にデバイスやエミュレータに配置することが出来ます。
この時 Visual Studio でデータのビルドアクションを指定し、どのように配置をするのか指定することが出来ます。

#ref(buildaction-01.jpg);

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

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

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

#ref(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));
 }

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

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

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