リソース/コンテンツを分離ストレージに保存する
プロジェクトに画像などのデータを「リソース(Resource)もしくはコンテンツ」としてアセンブリに同梱し、その画像の URI を Image.Source に指定することで画像の表示などが出来ます。
Image.Source 等で URI を指定することで読み込みが出来るのでファイルと同じように FileStream などで読み込めると思いきや、そうではないので注意が必要です。
というのも WP7 では(Silverlight では)、アプリが独自に読み書きできるストレージ領域は「分離ストレージ」というアプリ個別に割り当てられたストレージエリアを使用することが出来ます。というか分離ストレージしか自由になりません。
WPF や WinForm のように HDD 全領域にアクセスできるのではなく、そのアプリ用に用意されたストレージエリアでこの内部であれば自由にファイルやフォルダの作成・削除が可能です。
で、ここで混乱するのが「プロジェクトに格納した画像を "コンテンツ" にしても」ファイルは分離ストレージに格納されるわけでは無いと言うことです。
というわけで「プロジェクトに格納したテキストファイルを、別途プログラム中で読み込みたい」という場合は、そのファイルを別途リソースエリアから読み込み、分離ストレージにコピーする必要があります。
リソースから分離ストレージにコピーする
たとえば以下の画像のように、画像をプロジェクトに格納したとします。
ファイル名 | ビルドアクション |
01.jpg | Resource |
02.jpg | コンテンツ |

このファイルを分離ストレージにコピーするには、以下の ResourceToFile メソッドを実行します。
- ※読み込むリソースのビルドアクションによって、読み込み時の URI 指定が異なるので注意です。
参照 ビルドアクション リソース/コンテンツ URI の指定方法
ResourceToFile メソッドを見ると分かると思いますが、リソースエリアにはストリームとしてアクセスすることが出来ますので、ファイルをストリームとして読み込むだけであれば必ずしも分離ストレージにコピーする必要はありません。
// コピー先のフォルダを作成しておく // この場合は Image フォルダ // リソースから分離ストレージにコピーする ResourceToFile(@"/AssemblyName;component/Contents/Image/01.jpg", "Image/01.jpg"); ResourceToFile(@"Contents/Image/02.jpg", "Image/02.jpg"); // リソースから分離ストレージにコピーするメソッド public static void ResourceToFile(string respath, string dst) { // リソースのストリームを開く StreamResourceInfo resource = Application.GetResourceStream(new Uri(respath, UriKind.Relative)); // コピー用のバッファを準備する byte[] bytes = new byte[resource.Stream.Length]; // リソースから読み取る resource.Stream.Read(bytes, 0, bytes.Length); // ファイルに出力する using (IsolatedStorageFile iso = IsolatedStorageFile.GetUserStoreForApplication()) { using (IsolatedStorageFileStream stream = iso.CreateFile(dst)) { stream.Write(bytes, 0, bytes.Length); } } }
Rx を使ってないのはご愛敬と言うことで。