XAMLって今まで画面専用マークアップ言語だと思ってたけど大きな勘違いをしてたっぽい。
とても汎用的につかえるオブジェクトのマークアップ言語だったのね。
ってことで実験。
XAMLFamilyって名前でコンソールアプリのプロジェクトを作って、WindowsBaseとPresentationFrameworkとPresentationCoreを参照に追加。
XAMLFamilyにFamilyクラスを作ってみた。
中身はNameプロパティを持つだけのシンプルなものです。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace XAMLFamily
{
public class Family
{
public string Name { get; set; }
}
}
んで、Family.xamlっていうファイルをひとつ追加。
XMLとして作ってしまおう。(csファイルはいらないから)
ビルドアクションは、埋め込まれたリソースにします。
作ったら下のようなXMLを書きます。
<f:Family
xmlns:f="clr-namespace:XAMLFamily;assembly=XAMLFamily"
Name="孫悟空一家">
</f:Family>
Mainに下のようなプログラムを書くと、コンソールに「孫悟空一家」と表示されます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Markup;
using System.Reflection;
using System.IO;
namespace XAMLFamily
{
class Program
{
static void Main(string[] args)
{
Stream xaml = Assembly.GetExecutingAssembly().GetManifestResourceStream("XAMLFamily.Family.xaml");
Family family = (Family) XamlReader.Load(xaml);
Console.WriteLine(family.Name);
}
}
}
XAMLを読み込んでFamilyクラスのインスタンスを作ってます。
XAMLに定義した内容は、
Family family = new Family() { Name = "孫悟空一家" };
とまったく同じです。
さて、Familyには誰かしらが所属してるのでそういう風にしていきます。
Personクラスを作って、FamilyにICollection<Person>型のMembersプロパティを作ります。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace XAMLFamily
{
public class Family
{
public Family()
{
Members = new List<Person>();
}
public string Name { get; set; }
public List<Person> Members { get; set; }
}
public class Person
{
public string Name { get; set; }
}
}
XAMLのほうにガシガシ定義を追加していきます。
Family.MembersにPersonを追加して家族っぽくしていきます。
<f:Family
xmlns:f="clr-namespace:XAMLFamily;assembly=XAMLFamily"
Name="孫悟空一家">
<f:Family.Members>
<f:Person Name="孫悟空" />
<!-- チチって苗字孫なの? -->
<f:Person Name="孫チチ" />
<f:Person Name="孫悟飯" />
<f:Person Name="孫悟天" />
</f:Family.Members>
</f:Family>
Mainの方もFamilyクラスのMembersの中身を出力するようにします。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Markup;
using System.Reflection;
using System.IO;
namespace XAMLFamily
{
class Program
{
static void Main(string[] args)
{
Stream xaml = Assembly.GetExecutingAssembly().GetManifestResourceStream("XAMLFamily.Family.xaml");
Family family = (Family) XamlReader.Load(xaml);
Console.WriteLine(family.Name);
// 家族のメンバーも表示するよ
family.Members.ForEach(p => Console.WriteLine("\t{0}", p.Name));
}
}
}
実行してみると、XAMLに定義した家族のメンバーが表示されます。
孫悟空一家
孫悟空
孫チチ
孫悟飯
孫悟天
そっかぁ今までWPFで画面作るのにやってたのは、System.Windows.Windowクラスのインスタンスを組み立ててただけなんだぁと納得。
んじゃ、Grid.Rowとかみたいなのは、どういうことになってるの?ってのを見て見ると、staticメソッドのSet~って形で作るみたい。
へぇ~。なるほろ。
工夫次第でほかのものにも使えそうな感じがしてきた。