2013年07月09日

WPFサンプル:コンテンツファイルを扱う

   このエントリーをはてなブックマークに追加 Clip to Evernote
WPFアプリケーションで利用するデータファイルには、次の3種類があります。

1. リソースファイル
2. コンテンツファイル
3. 起点サイトファイル

前回はリソースファイルのサンプルを示しましたが、今回はコンテンツファイルのサンプルです。

コンテンツファイルは、リソースファイルとは異なり、実行アセンブリには組み込まれませんが、ビルド時に、コンテンツファイルとの明示的な関連付けが行われます。
リソースファイルとは異なり、アセンブリに組み込まれないため、ファイルが変更されても、ビルドし直す必要はありません。

データファイルをコンテンツファイルとして設定するには、プロジェクトファイルに、データファイルをプロジェクトに追加し、プロジェクトの[ビルド アクション]を[コンテンツ]に設定すると共に、[出力ディレクトリにコピー]を[常にコピーする](または[新しい場合はコピーする])に設定します。

コンテンツファイルを読み込むには、ApplicationクラスのGetContentStreamメソッドを利用します。プロジェクトに[data]フォルダを作成し、そこに 以下のような people.xmlを追加した場合の例を示します。

<?xml version="1.0" encoding="utf-8" ?>
<People>
  <Person IsReal="true">
    <Name>坂本竜馬</Name>
    <Age>35</Age>
  </Person>
  <Person IsReal="true">
    <Name>井伊直弼</Name>
    <Age>44</Age>
  </Person>
  <Person IsReal="false">
    <Name>明智小五郎</Name>
    <Age>39</Age>
  </Person>
  <Person IsReal="true">
    <Name>勝海舟</Name>
    <Age>18</Age>
  </Person>
  <Person IsReal="true">
    <Name>西郷隆盛</Name>
    <Age>52</Age>
  </Person>
</People>
ボタンクリックで、xmlファイルを読み込み、Name要素を ListBoxにバインドしています。 C#のコードは次のようになります。
using System;
using System.Linq;
using System.Windows;
using System.Xml.Linq;
namespace ContentsFileSample {
    public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();
        }
        private void Button_Click_1(object sender, RoutedEventArgs e) {
            Uri uri = new Uri("data/people.xml", UriKind.Relative);
            var info = Application.GetContentStream(uri);
            XDocument xdoc = XDocument.Load(info.Stream, LoadOptions.None);
            listBox1.ItemsSource = from xperson in xdoc.Root.Elements()
                                   select xperson.Element("Name").Value;
        }
    }
}

プロジェクトに追加したフォルダ名と読み込むフォルダ名が対応していない場合は、例外が発生します。
たとえは、上記C#のコードの1行目の "data/people.xml"を"resource/people.xml"に変更し、実行時のディレクトリ名も、resourceにリネームした場合は、ビルド時に決定されたコンテンツの場所と異なるため、例外が発生し正しく動作しません。

最後に実行例とXAMLを示します。

contentsFile

<Window x:Class="ContentsFileSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="300" Width="200" >
    <DockPanel>
        <Button Content="Load" Margin="10"
                VerticalAlignment="Top" Click="Button_Click_1" DockPanel.Dock="Top"/>
        <ListBox x:Name="listBox1" 
                 Margin="10,0,10,10" DockPanel.Dock="Bottom" />
    </DockPanel  >
</Window>


WPFサンプル・目次


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52327555