Silverlightアセンブリにファイルを埋め込み、そのファイルにアクセスする

SilverlightアセンブリにイメージファイルやCSVファイル、フォントファイルなどを埋め込む方法と、埋め込んだファイルにアクセスする方法をご紹介します。

サンプルコードのダウンロード

今回の記事用のサンプルコードを下記からダウンロードすることができます。参考にしてください。

ファイルをアセンブリに埋め込む

ファイルをアセンブリに埋め込む手順は下記の通りです。

  1. ファイルをプロジェクトに追加する。
  2. プロパティウィンドウでビルドアクションを「Resource」に指定する。

ファイルをプロジェクトに追加します。

ファイルのコンテキストメニューからプロパティを選択し、プロパティウィンドウを表示します。

プロパティウィンドウでビルドアクションを「Resource」に指定します。[埋め込まれたリソース] ビルド アクションを指定しないように注意してください。

同様の手順でフォントも埋め込みます。

最後にCSVファイルを埋め込みます。こんな内容をcsv拡張で保存しプロジェクト設定します。SilverlightUTF-8しか取り扱えないので、ファイルを保存するときにエンコードを「UTF-8」に変更するのを忘れないようにしましょう。

No.,名前,年齢
1,Yamada,30
2,Sato,25
3,Suzuki,18

埋め込んだファイルにアクセスする

画像ファイルにアクセス

埋め込んだ画像ファイルへはこんなURIフォーマットでアクセスします。

/{アセンブリ名};component/{指定したアセンブリをルートにしたファイルパス}

例えば、sample.jpgにアクセスする場合、

/Library1;component/Image/sample.jpg

となります。XAMLで指定するとこうなります。

<Image x:Name="Sample1Image" Source="/Library1;component/Image/sample.jpg" Margin="3" Width="100" Height="100"/>

C#コードからアクセスする例です。

// C#コードから埋め込んだイメージファイルにアクセス。
var imageUri = new Uri("/Library1;component/Image/sample.jpg", UriKind.Relative);
var bitmapImage = new BitmapImage(imageUri);
this.Sample2Image.Source = bitmapImage;
フォントファイルにアクセス

埋め込んだフォントファイルへはこんなURIフォーマットでアクセスします。フォントファイルを指定した後ろに「#」で区切りフォントファミリ名を指定するところがポイントになります。

/{アセンブリ名};component/{指定したアセンブリをルートにしたファイルパス}#{フォントファミリ名}

Segoe Condensedをフォントファミリに指定する場合、

/Library1;component/Fonts/segoe.ttf#Segoe Condensed

となります。XAMLで指定するとこうなります。

<TextBlock x:Name="Sample1TextBlock" FontFamily="/Library1;component/Fonts/segoe.ttf#Segoe Condensed" Text="resource file access" Margin="3"/>

C#コードからアクセスする例です。

// C#コードから埋め込んだフォントにアクセス。
this.Sample2TextBlock.FontFamily = new FontFamily("/Library1;component/Fonts/segoe.ttf#Segoe Condensed");
CSVファイルにアクセス

埋め込んだCSVファイルへは、画像ファイルと同様のURIフォーマットでアクセスします。

/Library1;component/Sample.csv

CSVファイルにアクセスするヘルパーメソッドを定義しておきます。

/// <summary>
/// CSVファイルを読み込む
/// </summary>
/// <param name="csvPath"></param>
/// <returns></returns>
private List<List<string>> ReadCsv(string csvPath)
{
    var result = new List<List<string>>();

    // CsvファイルのStreamを取得
    var uri = new Uri(csvPath, UriKind.Relative);
    StreamResourceInfo streamInfo = Application.GetResourceStream(uri);
    Stream stream = streamInfo.Stream;

    using (StreamReader r = new StreamReader(stream))
    {
        string header = r.ReadLine(); // ヘッダ空読み

        // 1行づつデータ読み込み
        string line;
        while ((line = r.ReadLine()) != null)
        {
            List<string> csvList = new List<string>();

            // 「改行コード」を削除
            line = line.Replace("\r", string.Empty);
            line = line.Replace("\n", string.Empty);

            string[] cells = line.Split(',');
            foreach (var item in cells)
            {
                // 「"」を削除
                string cell = item.Replace("\"", string.Empty);
                csvList.Add(cell);
            }

            result.Add(csvList);
        }
    }

    return result;
}

このヘルパーメソッドを使って埋め込んだCSVファイルを読み込んでみます。

// csvファイルを読み込む
string csvPath = "/Library1;component/Sample.csv";
List<List<string>> scvData = this.ReadCsv(csvPath);
foreach (List<string> line in scvData)
{
    foreach (string cell in line)
    {
        System.Diagnostics.Debug.WriteLine(cell);
    }
}

実行結果です。

1
Yamada
30
2
Sato
25
3
Suzuki
18

まとめ

ファイルをアセンブリに埋め込む方法と、埋め込んだファイルにアクセスする方法を紹介しました。