Open棟梁Project - マイクロソフト系技術情報 Wiki
XAMLは、XMLをベースとしており、XAMLの各要素からCLRオブジェクトをインスタンス化し、「要素ツリー」を構築できる。
ここでは、WPFのXAMLの書き方を通して、
を説明する。
XAMLにおける各種の名前空間の宣言は、xmlns属性を使用したXML名前空間にて行う。
ここでは、以下の既定の名前空間の宣言を例にとって説明する。
<Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
2行目のXML名前空間の宣言(xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation")では、WPFフレームワーク(PresentationFramework?.dll)のアセンブリ内に同梱されるURIにマップされたCLR名前空間(System.Windows.Controls、System.Windows.Dataなど)を、既定のXML名前空間(プレフィックスなし)として割り当てている。そのため、既定でXAMLからWPFフレームワークのCLRオブジェクトを利用できる。
3行目のXML名前空間の宣言(xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml")では、URIにマップされた共通的なXAMLの言語機能がXML名前空間(x)として割り当てられている。これにより、「x:」というプレフィックスを使用することで、「言語機能」で説明する、XAMLの言語機能を使用できるようになる。
CLR名前空間について以下を例にとって説明する。
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:igDP="http://infragistics.com/DataPresenter" <--- 名前空間の宣言(追加
Title="Window1" Height="300" Width="300">
<Grid>
<igDP:XamDataGrid Name="xamDataGrid1"/> <--- 名前空間の使用例
</Grid>
</Window>Infragistics社製のNetAdvantage?など、XmlnsDefinition?アセンブリ属性でURIとCLR名前空間のマップが指定されたサードパーティ製のUIコンポーネントをD&DでVSデザイナから追加した場合、上記の例のように自動的にXML名前空間の宣言が追加される。
なお、XML名前空間には一意の名前を自由に付与でき(上記の例ではigDP)、このプレフィックスを使用することで、XAMLからUIコンポーネントのCLRオブジェクトを利用できる。
この他に、URIとしてCLR名前空間とアセンブリを直接指定する方法もある。
xmlns:sys="clr-namespace:(CLR名前空間);assembly=(アセンブリ名)"
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:igDP="clr-namespace:Infragistics.Windows.DataPresenter;assembly=Infragistics3・・・" <--- 名前空間の宣言
Title="Window1" Height="300" Width="300">
<Grid>
<igDP:XamDataGrid Name="xamDataGrid1"/> <--- 名前空間の使用例<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib" <--- 名前空間の宣言
Title="Window1" Height="300" Width="300">
<Window.Resources>
<x:Array x:Key="List" Type="{x:Type sys:String}"> <--- 名前空間の使用例<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:uc="clr-namespace:WpfApplication1" <--- 名前空間の宣言
Title="Window1" Height="300" Width="300">
<StackPanel Orientation="Vertical">
<uc:UserControl1 x:Name="userControl1"/> <--- 名前空間の使用例XAMLの言語機能である
について説明する。
XAMLの言語機能が提供する各種ディレクティブについて説明する。
| 項番 | ディレクティブ | 説明 |
| 例 | ||
| 1 | x:Class | XAML上から分離クラス(コードビハインド)のクラス名を定義する。 |
| <Window x:Class="WpfApplication1.Window1" | ||
| 2 | x:Subclass | パーシャル クラスをサポートしない言語で使用する。通常は利用しない。 |
| - | ||
| 3 | x: ClassModifier? | クラスのアクセスレベルを変更する。通常は利用しない。 |
| - | ||
| 4 | x:Code | XAML上にインラインコードを実装する場合に使用する。通常は利用しない。 |
| <Grid> <x:Code> <![CDATA[ void button1_Click(object sender, RoutedEventArgs? e) { button1.Content = "Hello World"; } ]]> </x:Code> <Button Name="button1" Click="button1_Click">Button</Button> </Grid> | ||
| 5 | x:FieldModifier? | プロパティのアクセスレベルを変更する。通常は利用しない。 |
| - | ||
| 6 | x:Key | XAMLで定義された各種「リソース」を識別する。下記は、x:Keyを使用して「スタイル」の「リソース」をボタンに「データ バインディング」する例。 |
| <Window.Resources> <Style x:Key="buttonStyle" TargetType?="{x:Type Button}"> <Setter Property="Background" Value="LightYellow?" /> </Style> </Window.Resources> <Grid> <Button Style="{StaticResource? buttonStyle}">Hello Style</Button> </Grid> | ||
| 7 | x:Name | XAMLで生成したCLRオブジェクトに名前を付与する。Name属性と差異は無い。 |
| <Button x:Name="button1"> Click Here </Button> | ||
| 8 | x:Shared | 静的なリソースを、取得の度に生成する場合に使用する。通常は利用しない。 ※ true : 静的(全てのインスタンスは同じ) false : 動的(取得の度に生成する) 既定値 : true |
| - | ||
| 9 | x:TypeArguments? | ジェネリックの型引数をコンストラクタに渡す。 (.NET Framework 4.0のXAML 2009からのサポート) |
| <!-- XAML 2009 --> <ObservableCollection? x:TypeArguments?="Employee"> <l:Employee FirstName?="John" Name="Doe" /> <l:Employee FirstName?="Tim" Name="Smith" /> </ObservableCollection?> | ||
| 10 | x:Uid | ローカライゼーションのプロセスとツールによって使用される一意識別子を指定する 。 |
| - | ||
| 11 | xml:lang | カルチャ情報を宣言する。 |
| <Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xml:lang="ja-JP" |
XAMLの言語機能が提供する各種「マークアップ拡張」について説明する。
通常、「マークアップ拡張」は、「{」と「}」の2つの中括弧を使用することでXAMLパーサに対し、拡張されたプロパティ指定方法を指示する。
以下、XAMLの機能である「XAMLで定義されたマークアップ拡張」を一覧する。
これらの種類は、中括弧+「x:」プレフィックスの直後の文字列トークンによって識別される。
| 項番 | 文字列トークン | 説明 |
| 例 | ||
| 1 | x:Static | 静的プロパティ(定数、静的プロパティ、フィールド、列挙値)を参照する。 構文:<object property="{x:Static Member=prefix:typeName.staticMemberName?}" .../> |
| <Button Foreground="{x:Static Member=SystemColors?.InfoTextBrush?}" Background="{x:Static Member=SystemColors?.InfoBrush?}">  Click Here </Button> | ||
| 2 | x:Null | CLRオブジェクトのプロパティにnull値を設定する(既定値をnullクリアする場合など)。 |
| <Button x:Name="button1" Background="{x:Null}" Click="button1_Click"> Click Here </Button> | ||
| 3 | x:Type | CLRクラスの型情報を指定する。 |
| 詳しくは、下記、項番4の例を参照のこと。 | ||
| 4 | x:Array | IEnumerableを持つArrayオブジェクト(配列)を生成する。 |
| <Window.Resources> <x:Array x:Key="List" Type="{x:Type sys:String}"> <sys:String>A</sys:String> <sys:String>B</sys:String> <sys:String>C</sys:String> </x:Array> </Window.Resources> <StackPanel?> <ListBox? ItemsSource?="{Binding Source={StaticResource? List}}"/> </StackPanel?> ※ 先頭で、.NET FrameworkのSystem名前空間のインポートが必要 xmlns:sys="clr-namespace:System;assembly=mscorlib" ※ StaticResource?については次項で説明する。 |
※ x:Arrayは、例外的に中括弧と共に使用しない。
以下、WPF の機能である「WPF固有のマークアップ拡張」を一覧する。
こちらは、プロパティ値に「データ バインディング」や、「リソース」への参照を指定できる。