2013年07月11日

WPFサンプル:起点サイトファイルを扱う

   このエントリーをはてなブックマークに追加 Clip to Evernote
これまでリソースファイルコンテンツファイルのサンプルを示しましたが、今回は、起点サイトファイルのサンプルです。

起点サイトファイルは、コンテンツファイルと同様、アセンブリには組み込まれませんが、コンテンツファイルとは異なり、明示的な関係を持っていません。そのため、起点サイトファイルは「ビルド時にファイルが存在しない場合」や「実行時になるまで、どんなファイルが必要になるかわからない場合」に利用されます。

起点サイトファイルを利用するには、ビルド時にデータファイルが用意できる場合には、プロジェクトにファイルを追加し、[ビルドアクション]を[なし]に設定します。

前回と同様、アプリケーションの起動場所に、[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>
起点サイトファイルを読み込むには、ApplicationクラスのGetRemoteStreamメソッドを利用します。 以下C#のコードです。 ここでは、MainWindowコンストラクタで、xmlファイルを読み込み ListBoxにバインドしています。
using System;
using System.Linq;
using System.Windows;
using System.Xml.Linq;
namespace SiteOfOriginFilesSample {
    public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();
            Uri uri = new Uri("data/people.xml", UriKind.Relative);
            var info = Application.GetRemoteStream(uri);
            XDocument xdoc = XDocument.Load(info.Stream, LoadOptions.None);
            listBox1.ItemsSource = from xperson in xdoc.Root.Elements()
                                   select xperson.Element("Name").Value;
        }
    }
}

UriKind .Absolute を指定した場合は、以下のように URIを指定します。

Uri uri = new Uri( @"pack://siteoforigin:,,,/data/people.xml" , UriKind .Absolute);

以下実行結果とXAMLです。

SiteOfOrigin

<Window x:Class="SiteOfOriginFilesSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListBox x:Name="listBox1" HorizontalAlignment="Stretch"
                 VerticalAlignment="Stretch" />
    </Grid>
</Window>


WPFサンプル・目次
  

Posted by gushwell at 22:35Comments(0)TrackBack(0)

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サンプル・目次
  
Posted by gushwell at 22:00Comments(0)TrackBack(0)

2013年07月07日

WPFサンプル:リソースファイルを扱う

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

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

今日は、リソースファイルについてのサンプルを示します。

ここでの "リソースファイル" は、Resourcesプロパティで設定するリソースとは別ものです。
リソースファイルは、ビルド時に実行可能なアセンブリまたは、ライブラリアセンブリに組み込まれるデータフィルです。リソースファイルは、アセンブリに組み込まれますので、そのデータを変更する必要のない読み込み専用のファイルで利用します。また、アセンブリに組み込まれるますので、配布の複雑さを軽減することができます。

リソースファイルの構成データファイルをリソースファイルとして設定するには、組み込みたいファイルをプロジェクトに追加し、プロジェクトの[ビルド アクション]をResourceに設定します。

ResourceFile2

この状態で、プロジェクトをビルドすると、リソースがアセンブリに追加されます。

プログラムで、リソースファイルを読み込むには、ApplicationクラスのGetResourceStreamメソッドを利用します。プロジェクトに[data]フォルダを作成し、そこに Sample.txtを追加した場合の例を示します。

まずは、C#のコードです。

using System;
using System.IO;
using System.Windows;
using System.Windows.Resources;
namespace ResourceFileSample {
    public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();
        }
        private void button1_Click(object sender, RoutedEventArgs e) {
            Uri fileUri = new Uri("/data/Sample.txt", UriKind.Relative);
            StreamResourceInfo info = Application.GetResourceStream(fileUri);
            StreamReader sr = new StreamReader(info.Stream);
            textBlock1.Text = sr.ReadToEnd();
        }
    }
}

このコードでは、Sample.txtをStreamReader.ReadToEndで一気に読み込み、結果をtextBlock.Textに設定しています。

最後に、実行時のスクリーンショットとXAMLです。

ResourceFile


<Window x:Class="ResourceFileSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Content="Get" Height="23" HorizontalAlignment="Left" Margin="12,8,0,0"
                Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
        <ScrollViewer Margin="10,40,10,10" >
            <TextBlock Name="textBlock1" Text="TextBlock" HorizontalAlignment="Stretch"
                       TextWrapping="Wrap" VerticalAlignment="Stretch" FontFamily="MS Mincho"
                       FontSize="12" LineHeight="16" LineStackingStrategy="BlockLineHeight" />
        </ScrollViewer>
    </Grid>
</Window>


WPFサンプル・目次
  
Posted by gushwell at 21:51Comments(0)TrackBack(0)