XAMLとは
"XAML"は、ザムルと発音します。Extensible Application Markup Languageの略です。何でEAMLでないの?って思いますが、 多分英語で発音しづらいんでしょう。WPFのレイアウト配置を定義するのに用いるもので、XMLベースの言語です。というわけで、XMLの基本事項から説明します。
XMLの基本事項
XMLベースの言語として一番良く使われているのがWebのホームページに使われている"HTML"です。例えば次のような記述。
<html>
<body>HTML文です。</body>
</html>
上の例をテキストファイルに書いて、拡張子をhtmlにして保存すると、すぐにブラウザできることが出来ます。
当然ですが、これだけの記述でもXMLの特徴が十分に記述されています。
XMLは"拡張可能マークアップ言語"という意味です。基本的にはいろんなことに使用できるように作られていますので、 そういった意味では"拡張可能"ということだと思いますが、しかし最大の特徴はマークアップです。マークアップとは 文章の本文以外の情報のことで印刷物でいうとレイアウト情報、XAMLでいうとプロパティなんかがマークアップに当たります。
実はワープロのファイルにもマークアップ情報は含まれているんですが、編集段階で見えていると文章がわかりづらいのでマークアップは 見えないようにしています。しかし敢えて"<"、">"で囲まれたタグと呼ばれるものででマークアップを 記述したものがXMLになります。
【タグ】
"<"、">"で囲まれた中に"/"がないのが開始タグ、"/"があるのが終了タグといいます。 また開始タグが"/>"で閉じていた場合、それは終了タグの意味も含んでいます。開始タグと終了タグに挟まれた部分を要素の内容と呼んで、文章でいうところの本文に当たります。タグの部分と要素の内容を合わせて 要素といいます。
要素の中には要素を書くことが出来て、その場合外側の要素を親要素、内側の要素を子要素と呼びます。また一番外側の要素を特に ルート要素と呼びます。
またXAMLには次の決まりがあります。
・すべての開始タグと終了タグはペアになっているか、タグが"/>"で閉じていること。
・ルート要素は1つだけであること。
・親要素の終了タグが子要素の終了タグより先に来ないこと。
・タグ内の大文字/小文字は区別する。
一番最後なんかはプログラムのとき重要です。Iron Pythonも大文字/小文字を区別するのでBugにならないように注意が必要ですが、 XAMLを記述する際にも同様に注意する必要があるということです。
逆に慣用的に人が見やすいようにインデントを入れて、子要素を親要素よりも下げて記述することをXML(XAML)で行いますが、 XML(XAML)ではIron Pythonのように重要ではなく、インデントは無視されます。
【属性】
またHTMLを使って説明します。
<html>
<body>
<font size="40">HTML</font>文です。
</body>
</html>

今回は"HTML"の前後をfontのタグで囲みました。今までのタグと違うのは、「size="40"」という記述が fontのタグの中に書かれていることです。この意味はfontタグのsize属性が40であるという意味です。つまり属性とはタグの 性質を表します。
【名前空間】
名前空間はモジュール化の説明の中でしていますが、Iron Pythonの名前空間は異なるモジュール間の同一の名前を 区別するために使われる考えで、"sys.version"や"System.Version"のように名前空間.名前で指定できます。同じような問題がXMLでもあります。XMLの名前空間の指定の仕方をHTMLを例にして説明します。
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<font size="40">HTML</font>文です。
</body>
</html>
HTML文をもう少し正確に書くと、上のようになります。名前空間は、xmlnsという名前の属性として指定します。
特にXMLでは名前空間にWebサイトのURIを用います。
xmlnsはxml Name Spaceの略でしょう。では名前空間の記述を省略せず厳密に書いた場合どうなるかというと、
例えば次のようになります。
<t:html xmlns:t="http://www.w3.org/1999/xhtml">
<t:body>
<t:font t:size="40">HTML</t:font>文です。
</t:body>
</t:html>
名前空間の定義名をxmlns:の後に記述して、その名前空間上の名前は名前空間:名前で指定します。ただし、前に書いた名前空間の省略したHTML文は名前空間を省略したものではなく、名前空間の指定なしで使った 名前は:(コロン)を使わずに定義した名前空間に属するという決まりに則った記述です。このような名前空間を デフォルト名前空間と呼びます。
HTML文では別の決まりとしてhtmlなどのタグはデフォルト名前空間になければいけないようで、残念ながら、 勝手に名前空間を記述したHTML文は、ちゃんとは動きません。
【コメント】
XML文内にコメントを書くことができます。コメントは、"<!--"で始まり、"-->"で終わるまでの文字列として書きます。
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<!-- この行はコメントです。 -->
<font size="40">HTML</font>文です。
</body>
</html>
XAMLのタグ
XMLの基本事項を勉強した上で改めてWinForm ⇒ WPF ⇒ XAMLの違い で説明したXAML文を眺めてみましょう。
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="with xaml" Height="200" Width="250" WindowStartupLocation="CenterScreen">
<Canvas>
<Button x:Name="button1"
Content="Let's Click"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Margin="90,115,0,0"
Click="Button_Click" />
<Label x:Name="label1" Canvas.Left="53" Canvas.Top="35" />
</Canvas>
</Window>
ぱあっと見るとタグがオブジェクトで、属性がプロパティを表しているのがわかりますか。
そういう目で見ると、XAMLはオブジェクトを定義するのに都合がよい記述方法であることがわかってきます。ではもう少し詳しく見て行きましょう。
Windowsタグ
上記のXAMLファイル内では、Windowタグがすべての親要素であるため、ルート要素ということになります。またWindowタグの中には 2つの名前空間の定義があります。"xmlns=・・・"で始まる行の名前空間をWPF名前空間、"xmlns:x=・・・"で 始まる行の名前空間をXAML名前空間と呼びます。WPF名前空間はWindows Presentation Foundationの ライブラリ内で定義されているものタグが記述されている空間です。
XAML空間はXAML の仕様自体に含まれるタグが記述されています。例えば後述のButtonタグやLabelタグ内に記述されている"x:Name"が XAML空間内のタグに当り、主に他のドキュメント(今回であれば、スクリプトファイル"with_xaml.pyファイル")との連携をとるために 使われます。
またWindowタグ内ではいくつかの属性が記述されており、Windowのタイトルを表すTitle属性、Windowの高さ/幅を表すHeight属性/Width属性、 最初にWindowを表示させる位置を示すWindowStartupLocation属性が定義されています。
Cavasタグ
Windowタグの子要素として定義されています。XAMLではレイアウトするためのオブジェクトで、今回はWindowにコンポーネントを配置するために 使用しています。Buttonタグ
Buttonオブジェクトを表します。属性の定義により次のプロパティが設定されていることがわかると思います。・コンテンツ(ボタンに表示されている文字)は「Let's Click」
・水平方向の整列基準は「Left」
・垂直方向の整列基準は「Top」
・マージン(周囲の空白)は「90,115,0,0」
(つまりボタンの左隅がCanvasの90ピクセル、右隅がCanvasの115ピクセルの位置)
他の属性についてx:Nameはスクリプトファイル(with_xaml.pyファイル)と連携が取れるようにButttonオブジェクトに"button1"という名前をつけています。
またButtonをClickした際には、Click属性に定義されている関数に呼び込まれます。Click属性に定義されている"Button_Click"は スクリプトファイル(with_xaml.pyファイル)に記述されている関数です。
Labelタグ
Canvas内に配置されたLabelオブジェクトを表します。Canvas.Left、Canvas.Top属性ではLabelオブジェクトの配置位置を定義しています。またx:Name属性はスクリプトファイル(with_xaml.pyファイル)内で使用するために定義しています。