XAML入門 -コンテンツ構文-

今回はXAML構文の1つ、コンテンツ構文です。


コンテンツ構文は書籍やネットでは良く「コンテンツプロパティ」の解説の一環として説明されていますが、MSDNではきちんと「コンテンツ構文」として説明されています。

いつもの通りMSDNの説明を見てみます。


XAML コンテンツ構文は、クラス宣言の一部として ContentPropertyAttribute が指定されているクラスでのみ有効な構文です。ContentPropertyAttribute は、その型の要素 (派生クラスを含む) のコンテンツ プロパティとして定義されるプロパティを名前で指定するパラメータを必要とします。このようにして指定されたプロパティが、要素の XAML コンテンツ プロパティになります。XAML プロセッサによる処理の際には、要素の開始タグと終了タグの間で検出されたすべての子要素や内部テキストが、その XAML コンテンツ プロパティの値として割り当てられます。必要に応じて、コンテンツ プロパティのプロパティ要素を指定し、そのマークアップを明示的にすることができます。この方法は、マークアップをわかりやすくするために、またはマークアップのスタイルとして有効な場合もあります。しかし通常、コンテンツ プロパティの目的は、マークアップを簡素化して、直感的に親子として関連付けられる要素を直接入れ子にできるようにすることです。


まずは簡単な例より説明を見ていきます。


<UserControl>
    <Button>Click Me!</Button>
</UserControl>

上記例ではUserControlクラスとButtonクラスでコンテンツ構文が使われています。

コンテンツ構文を使わない場合が下記例になります。


<UserControl>
    <UserControl.Content>
        <Button Content="Click Me!" />
    </UserControl.Content>
</UserControl>

UserControlクラスとButtonクラスはSystem.Windows.Controls.ContentControlクラスを継承してます。

ContentControlクラスはContentプロパティを持っており、ContentPropertyAttributeでContentプロパティが指定されています。


C#
[ContentProperty("Content")]
public class ContentControl

VB
<ContentProperty("Content")> _
Public Class ContentControl

このようにContentPropertyAttributeにて指定されたプロパティがコンテンツプロパティとして扱われ、コンテンツ構文にて使用出来るようになります。

なを、プロパティ要素(<ElementTypeName.PropertyName>)で設定する子要素又は、内部テキストはコンテンツ構文とは認識されません。

またクラスでコンテンツプロパティは1つしか指定出来ません。

コンテンツプロパティを用いて複数のオブジェクトを指定したい場合は、ContentPropertyAttributeにて指定するプロパティの型がコレクション型である必要があります。



下記は使用頻度の高いSystem.Windows.Controls.StackPanelクラスのコンテンツプロパティを使用した例です。


<UserControl>
    <StackPanel>
        <TextBox>Hello World!</TextBox>
        <Button>Click Me!</Button>
    </StackPanel>
</UserControl>

StackPanelクラスのコンテンツプロパティは継承元のSystem.Windows.Controls.PanelクラスのChilrenプロパティになってます。

ChildrenプロパティはSystem.Windows.Controls.UIElementCollection型である為、UIElementクラスから派生しているクラスを格納する事が出来ます。



MSDNの説明でも書かれている通り、XAMLの定義を簡素化し、オブジェクトの親子関連を直感的にする仕組みです。

コンテンツプロパティはクラスによって様々ありますので、使用するクラスのコンテンツプロパティを参照して下さい。