XAML で定義ファイルを作る

このエントリは、Silverlight Advent Calendar 2011 への16日目の参加記事です。
もうすでに12月17日ですが。。。。


Silverlight では XAML って UI の定義に使われているだけで、実際にはオブジェクトのインスタンス構造の定義なんで、 UI 以外でもなんでも使えるんですね。で、今回は XAML を使って定義ファイルを作ろうって話です。


まずは、とりあえず XAML ファイルを追加します。で、ビルドアクションを「コンテンツ」にしておきます。ここでは config.xaml ってファイル名にします。


これで、 XAP ファイルのコンテンツとして config.xaml が配置されます。編集したかったら XAP ファイルを ZIP で解凍して、編集して、また ZIP で固めるだけで OK 。


次に、この config.xaml を読み取るコードを書きます。以下のような感じ。

public static ResourceDictionary GetConfig()
{
  XmlReaderSettings settings = new XmlReaderSettings();
  settings.XmlResolver = new XmlXapResolver();
  using (XmlReader reader = XmlReader.Create("config.xaml", settings)) {
    if (reader.Read())
    {
      string xaml = reader.ReadOuterXml();
      return XamlReader.Load(xaml) as ResourceDictionary;
    }
  }
  return null;
}

XmlReaderSettings の XmlResolver に指定している XmlXapResolver ってのがポイントですね。あとは普通に読み取って XamlReader で Load するだけです。


じゃ、この config.xaml に定義したいクラスをつくります。とりあえずここでは User ってのを作ってます。

public class User
{
  public string FirstName { get; set; }

  public string FamilyName { get; set; }

  public int Age { get; set; }

}


で、こいつを config.xaml に定義します。以下のような感じになります。

<ResourceDictionary
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:l="clr-namespace:SilverlightApplication10;assembly=SilverlightApplication10">

  <l:User x:Key="User"
          FirstName="taro"
          FamilyName="sato"
          Age="18" />

</ResourceDictionary>

ネームスペースの指定を clr-namespace・・・で指定するときは assembly まで含めないとダメなので気をつけてください。 x:Key で指定している値はプログラム上で取得する時に利用するのですが、これはクラス名と一致させておいてあげると分かりやすいかもしれません。


インテリセンスも効いてますね。


で、最後に定義内容を取得してあげると。

ResourceDictionary config = GetConfig();

User user = (User)config["User"];


問題なく取得できてます。