XAML 構文のガイド
XAML 構文の規則と、XAML 構文で使用できる制限または選択肢を説明する用語について説明します。 このトピックは、XAML 言語を初めて使用する場合、用語または構文の一部を更新する場合、または XAML 言語がどのように機能し、より多くの背景とコンテキストが必要であるかについて興味がある場合に役立ちます。
XAML は XML です
拡張アプリケーション マークアップ言語 (XAML) には、XML 上に構築される基本的な構文があり、定義上有効な XAML は有効な XML である必要があります。 ただし、XAML には、XML を拡張する独自の構文の概念もあります。 特定の XML エンティティはプレーン XML で有効な場合がありますが、その構文は XAML とは異なり、より完全な意味を持つ場合があります。 このトピックでは、これらの XAML 構文の概念について説明します。
XAML ボキャブラリ
XAML がほとんどの XML 使用法と異なる領域の 1 つは、通常、XSD ファイルなどのスキーマでは XAML が適用されないことです。 これは、XAML が拡張可能であることを意図しているためです。これは、頭字語 XAML の "X" の意味です。 XAML が解析されると、XAML で参照する要素と属性は、一部のバッキング コード表現 (Windows ランタイムによって定義されたコア型、またはWindows ランタイムを拡張または基づく型) に存在することが期待されます。 SDK ドキュメントでは、既にWindows ランタイムに組み込まれている型を参照し、XAML でWindows ランタイムのXAML ボキャブラリとして使用できます。 Microsoft Visual Studio は、この XAML ボキャブラリ内で有効なマークアップを生成するのに役立ちます。 Visual Studio では、これらの型のソースがプロジェクトで正しく参照されている限り、XAML を使用するためのカスタム型を含めることもできます。 XAML とカスタム型の詳細については、「 XAML 名前空間と名前空間マッピングを参照してください。
オブジェクトの宣言
プログラマは多くの場合、オブジェクトとメンバーの観点から考えますが、マークアップ言語は要素と属性として概念化されます。 最も基本的な意味では、XAML マークアップで宣言する要素は、バッキング ランタイム オブジェクト表現のオブジェクトになります。 アプリのランタイム オブジェクトを作成するには、XAML マークアップで XAML 要素を宣言します。 オブジェクトは、Windows ランタイムが XAML を読み込むと作成されます。
XAML ファイルには、常にルートとして機能する要素が 1 つだけ含まれています。この要素は、ページなどのプログラミング構造の概念的なルートとなるオブジェクト、またはアプリケーションの実行時定義全体のオブジェクト グラフを宣言します。
XAML 構文では、XAML でオブジェクトを宣言する 3 つの方法があります。
- オブジェクト要素の構文を使用して直接: これは、開始タグと終了タグを使用して、XML 形式の要素としてオブジェクトをインスタンス化します。 この構文を使用すると、ルート オブジェクトを宣言したり、プロパティ値を設定する入れ子になったオブジェクトを作成したりできます。
- 間接的に属性構文を使用する: オブジェクトを作成する方法を示すインライン文字列値を使用します。 XAML パーサーは、この文字列を使用して、プロパティの値を新しく作成された参照値に設定します。 サポートは、特定の一般的なオブジェクトとプロパティに限定されます。
- マークアップ拡張機能の使用。
これは、XAML ボキャブラリでオブジェクトを作成するための構文を常に選択できるわけではありません。 一部のオブジェクトは、オブジェクト要素の構文を使用してのみ作成できます。 一部のオブジェクトは、最初に属性に設定することによってのみ作成できます。 実際、オブジェクト要素または属性構文を使用して作成できるオブジェクトは、XAML ボキャブラリでは比較的まれです。 両方の構文形式が可能な場合でも、スタイルの問題として構文の 1 つがより一般的になります。 XAML では、新しい値を作成するのではなく、既存のオブジェクトを参照するために使用できる手法もあります。 既存のオブジェクトは、XAML の他の領域で定義されるか、プラットフォームとそのアプリケーションまたはプログラミング モデルの何らかの動作によって暗黙的に存在する可能性があります。
オブジェクト要素構文を使用したオブジェクトの宣言
オブジェクト要素構文を使用してオブジェクトを宣言するには、 <objectName> </objectName>
のようなタグを記述します。ここで、 objectName はインスタンス化するオブジェクトの型名です。 Canvas オブジェクトを宣言するためのオブジェクト要素の使用方法を次に示します。
<Canvas>
</Canvas>
オブジェクトに他のオブジェクトが含まれていない場合は、開始/終了ペアではなく、1 つの自己終了タグを使用してオブジェクト要素を宣言できます。 <Canvas />
Containers
ui 要素として使用される多くのオブジェクト ( Canvas など) には、他のオブジェクトを含めることができます。 これらはコンテナーと呼ばれることもあります。 次の例は、1 つの要素である Rectangle を含む Canvas コンテナーを示しています。
<Canvas>
<Rectangle />
</Canvas>
属性構文を使用したオブジェクトの宣言
この動作はプロパティ設定に関連付けられているため、これについては今後のセクションで詳しく説明します。
初期化テキスト
一部のオブジェクトでは、構築の初期化値として使用される内部テキストを使用して新しい値を宣言できます。 XAML では、この手法と構文は初期化テキスト 呼び出。 概念的には、初期化テキストは、パラメーターを持つコンストラクターの呼び出しに似ています。 初期化テキストは、特定の構造体の初期値を設定する場合に便利です。
x:Key を持つ構造体値が必要な場合は、ResourceDictionaryに存在できるように、初期化テキストでオブジェクト要素構文を使用することがよくあります。 これは、その構造体の値を複数のターゲット プロパティ間で共有する場合に行うことができます。 一部の構造体では、属性構文を使用して構造体の値を設定することはできません。初期化テキストは、有用で共有可能な CornerRadius、 Thickness、 GridLength または Color リソースを生成する唯一の方法です。
この省略された例では、初期化テキストを使用して Thickness の値を指定します。この場合、 Left と Right の両方を 20 に設定し、 Top と Bottom の両方を 10 に設定する値を指定します。 この例では、キー付きリソースとして作成された Thickness 、そのリソースへの参照を示します。 Thickness初期化テキストの詳細については、「Thickness」を参照してください。
<UserControl ...>
<UserControl.Resources>
<Thickness x:Key="TwentyTenThickness">20,10</Thickness>
....
</UserControl.Resources>
...
<Grid Margin="{StaticResource TwentyTenThickness}">
...
</Grid>
</UserControl ...>
注: 一部の構造体は、オブジェクト要素として宣言することはできません。 初期化テキストはサポートされておらず、リソースとして使用することはできません。 XAML でこれらの値にプロパティを設定するには、属性構文を使用する必要があります。 これらの型は、 Duration、 RepeatBehavior、 Point、 Rect および Size です。
プロパティの設定
オブジェクト要素の構文を使用して、宣言したオブジェクトにプロパティを設定できます。 XAML でプロパティを設定する方法は複数あります。
- 属性構文を使用する。
- プロパティ要素の構文を使用する。
- コンテンツ (内部テキストまたは子要素) がオブジェクトの XAML コンテンツ プロパティを設定する要素構文を使用します。
- コレクション構文 (通常は暗黙的なコレクション構文) を使用します。
オブジェクト宣言と同様に、このリストは、各手法でプロパティを設定できることを意味するものではありません。 一部のプロパティでは、いずれかの手法のみがサポートされます。 一部のプロパティでは、複数のフォームがサポートされています。たとえば、プロパティ要素の構文や属性構文を使用できるプロパティがあります。 可能な内容は、プロパティと、プロパティが使用するオブジェクトの種類の両方によって異なります。 Windows ランタイム API リファレンスでは、「Syntax」セクションで使用できる XAML 使用法を確認できます。 動作するが、より詳細な代替の使用法がある場合があります。 これらの詳細な使用方法は、XAML でそのプロパティを使用するためのベスト プラクティスまたは実際のシナリオを示そうとしているため、常に表示されるとは限りません。 XAML 構文のガイダンスは、XAML で設定できるプロパティのリファレンス ページの XAML Usage セクションで提供されています。
オブジェクトのプロパティには、XAML では設定できず、コードを使った場合にのみ設定できるプロパティもあります。 通常、これらは XAML ではなく、分離コードで使用する方が適切なプロパティです。
XAML で読み取り専用プロパティを設定することはできません。 コードでも、所有する型は、コンストラクターのオーバーロード、ヘルパー メソッド、計算プロパティのサポートなど、他の設定方法をサポートする必要があります。 計算プロパティは、他の設定可能なプロパティの値に加えて、場合によっては組み込みの処理を含むイベントに依存します。これらの機能は、依存関係プロパティ システムで使用できます。 依存関係プロパティが計算プロパティのサポートにどのように役立つのかについて詳しくは、「 Dependency プロパティの概要を参照してください。
XAML のコレクション構文は、読み取り専用プロパティを設定している外観を提供しますが、実際には設定されません。 このトピックで後述する「コレクション構文」を参照してください。
属性構文を使用したプロパティの設定
属性値の設定は、XML や HTML などのマークアップ言語でプロパティ値を設定する一般的な方法です。 XAML 属性の設定は、XML で属性値を設定する方法と似ています。 属性名は、要素名の後のタグ内の任意の時点で指定され、要素名から少なくとも 1 つの空白で区切られます。 属性名の後に等号が付きます。 属性値は、引用符のペア内に含まれています。 引用符は、値と一致して囲む限り、二重引用符または単一引用符のいずれかになります。 属性値自体は、文字列として表現できる必要があります。 多くの場合、文字列には数字が含まれますが、XAML では、XAML パーサーが関与し、基本的な値の変換を行うまで、すべての属性値は文字列値です。
この例では、4 つの属性の属性構文を使用して、Rectangle オブジェクトの Name、Width、Height、および Fill プロパティを設定します。
<Rectangle Name="rectangle1" Width="100" Height="100" Fill="Blue" />
プロパティ要素構文を使用したプロパティの設定
オブジェクトの多くのプロパティは、プロパティ要素の構文を使用して設定できます。 プロパティ要素は次のようになります: <
object.
property>
。
プロパティ要素の構文を使用するには、設定するプロパティの XAML プロパティ要素を作成します。 標準 XML では、この要素は名前にドットがある要素と見なされます。 しかし、XAML では、要素名に含まれるドットによって、その要素がプロパティ要素であること、つまり、バッキング オブジェクト モデルの実装で property が object のメンバーになると想定されていることがわかります。 プロパティ要素の構文を使用するには、プロパティ要素タグを "塗りつぶす" ためにオブジェクト要素を指定できる必要があります。 プロパティ要素には、常にいくつかのコンテンツ (単一要素、複数の要素、または内部テキスト) があります。自己終了プロパティ要素を持つことに意味はありません。
次の文法では、 property は設定するプロパティの名前であり、 propertyValueAsObjectElement は単一のオブジェクト要素であり、プロパティの値型の要件を満たすことが期待されます。
<
object>
<
object.
property>
propertyValueAsObjectElement
</
object.
property>
</
object>
次の例では、プロパティ要素構文を使用して、SolidColorBrush オブジェクト要素を使用してRectangleのFillを設定します。 ( 内SolidColorBrush、 Color は属性として設定されます)。この XAML の解析結果は、属性構文を使用して Fill を設定した前の XAML の例と同じです。
<Rectangle
Name="rectangle1"
Width="100"
Height="100"
>
<Rectangle.Fill>
<SolidColorBrush Color="Blue"/>
</Rectangle.Fill>
</Rectangle>
XAML ボキャブラリとオブジェクト指向プログラミング
Windows ランタイム XAML 型の XAML メンバーとして表示されるプロパティとイベントは、多くの場合、基本型から継承されます。 次の例を考えてみましょう: <Button Background="Blue" .../>
。 Background プロパティは、Button クラスですぐに宣言されたプロパティではありません。 代わりに、 Background は基本 Control クラスから継承されます。 実際に、 Button のリファレンス トピックを見ると メンバー リストには、連続する基底クラスのチェーン ( ButtonBase、 Control、 FrameworkElement、 UIElement、 DependencyObject) の各チェーンから継承されたメンバーが少なくとも 1 つ含まれていることがわかります。 Properties リストでは、すべての読み取り/書き込みプロパティとコレクション プロパティが XAML ボキャブラリの意味で継承されます。 イベント (さまざまな UIElement イベントなど) も継承されます。
XAML ガイダンスにWindows ランタイム参照を使用する場合、構文またはサンプル コードに示されている要素名は、最初にプロパティを定義した型の場合もあります。これは、その参照トピックが基底クラスから継承されるすべての可能な型によって共有されるためです。 XML エディターで Xaml に Visual Studio の IntelliSense を使用する場合、IntelliSense とそのドロップダウンは、継承を結合し、クラス インスタンスのオブジェクト要素を使用して開始した後に設定に使用できる属性の正確な一覧を提供する優れた作業を行います。
XAML コンテンツのプロパティ
一部の型は、プロパティが XAML コンテンツ構文を有効にできるように、プロパティの 1 つを定義します。 型の XAML コンテンツ プロパティの場合、XAML で指定するときに、そのプロパティのプロパティ要素を省略できます。 または、プロパティを内部テキスト値に設定するには、その内部テキストを所有する型のオブジェクト要素タグ内に直接指定します。 XAML コンテンツ プロパティは、そのプロパティの単純なマークアップ構文をサポートし、入れ子を減らすことで XAML をより人間が判読できるようにします。
XAML コンテンツ構文を使用できる場合、その構文は、Windows ランタイムリファレンス ドキュメントのSyntaxの 「XAML」セクションに表示されます。 たとえば、Border の Child プロパティ ページには、Border の単一オブジェクト Border.Child 値を設定するプロパティ要素構文ではなく、XAML コンテンツ構文が表示されます。
<Border>
<Button .../>
</Border>
XAML コンテンツ プロパティとして宣言されているプロパティが Object 型であるか、 String 型である場合、XAML コンテンツ構文は基本的に XML ドキュメント モデル内の内部テキストである、開始オブジェクト タグと終了オブジェクト タグの間の文字列をサポートします。 たとえば、TextBlock の Text プロパティ ページには、Text を設定する内部テキスト値を持つ XAML コンテンツ構文が表示されますが、文字列 "Text" はマークアップに表示されません。 次に使用方法の例を示します。
<TextBlock>Hello!</TextBlock>
クラスの XAML コンテンツ プロパティが存在する場合は、「属性」セクションのクラスのリファレンス トピックで示されています。 ContentPropertyAttributeの値を探します。 この属性は、名前付きフィールド "Name" を使用します。 "Name" の値は、XAML コンテンツ プロパティであるそのクラスのプロパティの名前です。 たとえば、 Border リファレンス ページには、ContentProperty("Name=Child") と表示されます。
重要な XAML 構文規則の 1 つは、XAML コンテンツ プロパティと、要素に設定した他のプロパティ要素を混在させることができないということです。 XAML コンテンツ プロパティは、プロパティ要素の前、または完全に後に設定する必要があります。 たとえば、これは無効な XAML です。
<StackPanel>
<Button>This example</Button>
<StackPanel.Resources>
<SolidColorBrush x:Key="BlueBrush" Color="Blue"/>
</StackPanel.Resources>
<Button>... is illegal XAML</Button>
</StackPanel>
コレクション構文
これまでに示した構文はすべて、プロパティを 1 つのオブジェクトに設定しています。 ただし、多くの UI シナリオでは、特定の親要素に複数の子要素を含めることができる必要があります。 たとえば、入力フォームの UI には、複数のテキスト ボックス要素、いくつかのラベル、および "送信" ボタンが必要です。 それでも、プログラミング オブジェクト モデルを使用してこれらの複数の要素にアクセスする場合は、通常、各項目が異なるプロパティの値ではなく、1 つのコレクション プロパティ内の項目になります。 XAML では、コレクション型を使用するプロパティを暗黙的として扱い、コレクション型の子要素に対して特別な処理を実行することで、複数の子要素をサポートするだけでなく、一般的なバッキング コレクション モデルもサポートしています。
多くのコレクション プロパティは、クラスの XAML コンテンツ プロパティとしても識別されます。 暗黙的なコレクション処理と XAML コンテンツ構文の組み合わせは、パネル、ビュー、項目コントロールなどのコントロールの合成に使用される型でよく見られます。 次の例は、StackPanel 内で 2 つのピア UI 要素を合成させる XAML を可能な限り単純化したものです。
<StackPanel>
<TextBlock>Hello</TextBlock>
<TextBlock>World</TextBlock>
</StackPanel>
XAML コレクション構文のメカニズム
最初は、XAML が読み取り専用コレクション プロパティの "set" を有効にしているように見える場合があります。 実際には、XAML でここで有効になるのは、既存のコレクションに項目を追加することです。 XAML サポートを実装する XAML 言語および XAML プロセッサは、この構文を有効にするために、バッキング コレクション型の規則に依存します。 通常、コレクションの特定の項目を参照するインデクサーや Items プロパティなどのバッキング プロパティがあります。 一般に、このプロパティは XAML 構文では明示的ではありません。 コレクションの場合、XAML 解析の基になるメカニズムはプロパティではなく、メソッドです。具体的には、ほとんどの場合、 Add メソッドです。 XAML プロセッサが XAML コレクション構文内で 1 つ以上のオブジェクト要素を検出すると、このような各オブジェクトが最初に要素から作成され、コレクションの Add メソッドを呼び出すことによって、各新しいオブジェクトが含まれるコレクションに追加されます。
XAML パーサーは、コレクションに項目を追加する場合、指定された XAML 要素がコレクション オブジェクトの許容される項目の子であるかどうかを判断する Add メソッドのロジックです。 多くのコレクション型は、バッキング実装によって厳密に型指定されます。つまり、 Add の入力パラメーターは、渡された型が Add パラメーター型と一致する必要があることを想定しています。
コレクションプロパティの場合は、コレクションをオブジェクト要素として明示的に指定しようとするときは注意してください。 XAML パーサーは、オブジェクト要素が検出されるたびに新しいオブジェクトを作成します。 使用しようとしているコレクション プロパティが読み取り専用の場合、XAML 解析例外がスローされる可能性があります。 暗黙的なコレクション構文を使用するだけで、その例外は表示されません。
属性またはプロパティ要素の構文を使用する場合
XAML での設定をサポートするすべてのプロパティは、直接値設定の属性またはプロパティ要素の構文をサポートしますが、どちらの構文も同じ意味でサポートされない可能性があります。 一部のプロパティではいずれかの構文がサポートされ、一部のプロパティでは XAML コンテンツ プロパティなどの追加の構文オプションがサポートされています。 プロパティでサポートされる XAML 構文の種類は、プロパティがそのプロパティ型として使用するオブジェクトの型によって異なります。 プロパティ型が double (float または decimal)、integer、Boolean、または string などのプリミティブ型の場合、プロパティは常に属性構文をサポートします。
また、属性構文を使用してプロパティを設定することもできます。そのプロパティの設定に使用するオブジェクト型を文字列の処理によって作成できる場合は、プロパティを設定します。 プリミティブの場合、これは常に、型変換がパーサーに組み込まれます。 ただし、他の特定のオブジェクト型は、プロパティ要素内のオブジェクト要素ではなく、属性値として指定された文字列を使用して作成することもできます。 これを機能させるには、基になる型変換が必要です。この変換は、その特定のプロパティによってサポートされるか、そのプロパティ型を使用するすべての値で一般的にサポートされます。 属性の文字列値は、新しいオブジェクト値の初期化に重要なプロパティを設定するために使用されます。 場合によっては、特定の型コンバーターは、文字列内の情報を一意に処理する方法に応じて、共通のプロパティ型の異なるサブクラスを作成することもできます。 この動作をサポートするオブジェクト型には、リファレンス ドキュメントの構文セクションに特別な文法が記載されています。 たとえば、Brush の XAML 構文は、属性構文を使用して、Brush 型の任意のプロパティに新しい SolidColorBrush 値を作成する方法を示しています (また、Windows ランタイム XAML には多くの Brush プロパティがあります)。
XAML 解析ロジックとルール
XAML パーサーが読み取る必要があるのと同様の方法で XAML を読み取ると便利な場合があります。これは、一連の文字列トークンが線形順序で検出された場合です。 XAML パーサーは、XAML のしくみの定義の一部である一連の規則の下で、これらのトークンを解釈する必要があります。
属性値の設定は、XML や HTML などのマークアップ言語でプロパティ値を設定する一般的な方法です。 次の構文では、 objectName はインスタンス化するオブジェクト、 propertyName はそのオブジェクトに設定するプロパティの名前、 propertyValue は設定する値です。
<objectName propertyName="propertyValue" .../>
-or-
<objectName propertyName="propertyValue">
...<!--element children -->
</objectName>
どちらの構文でも、オブジェクトを宣言し、そのオブジェクトにプロパティを設定できます。 最初の例はマークアップの 1 つの要素ですが、XAML プロセッサがこのマークアップを解析する方法については、実際には個別の手順があります。
まず、object 要素が存在することは、新しい objectName オブジェクトをインスタンス化する必要があることを示します。 そのようなインスタンスが作成された後にのみ、そのインスタンスにインスタンス プロパティ propertyName を設定できます。
XAML のもう 1 つのルールは、要素の属性を任意の順序で設定できる必要があるということです。 たとえば、 <Rectangle Height="50" Width="100" />
と <Rectangle Width="100" Height="50" />
に違いはありません。 使用する順序はスタイルの問題です。
注: XML エディター以外のデザイン サーフェイスを使うと、通常は XAML デザイナーによって並び順の規則が提示されますが、その XAML は後で自由に編集して、属性を並べ替えたり、新たな属性を導入したりできます。
添付プロパティ
XAML は、 アタッチされたプロパティと呼ばれる構文要素を追加することによって XML を拡張。 プロパティ要素の構文と同様に、添付プロパティの構文にはドットが含まれており、ドットは XAML 解析に特別な意味を持ちます。 具体的には、添付プロパティのプロバイダーとプロパティ名がドットで区切られます。
XAML では、構文 AttachedPropertyProvider. を使用して添付プロパティを設定します。PropertyName XAML で添付プロパティ Canvas.Left を設定する方法の例を次に示します。
<Canvas>
<Button Canvas.Left="50">Hello</Button>
</Canvas>
バッキング型でその名前のプロパティを持たない要素に添付プロパティを設定できます。その方法では、グローバル プロパティや、 xml:space 属性などの別の XML 名前空間によって定義された属性のように機能します。
Windows ランタイム XAML では、次のシナリオをサポートする添付プロパティが表示されます。
- 子要素は、親コンテナー パネルがレイアウトでどのように動作するかを通知できます( Canvas、 Grid、 VariableSizedWrapGrid。
- コントロールの使用は、コントロール テンプレートから取得される重要なコントロール パーツの動作に影響を与える可能性があります: ScrollViewer、 VirtualizingStackPanel。
- 関連クラスで使用できるサービスを使用すると、サービスとそれを使用するクラスは継承を共有しません: Typography、 VisualStateManager、 AutomationProperties、 ToolTipService。
- アニメーションのターゲット設定: Storyboard。
詳細については、「 Attached プロパティの概要を参照してください。
リテラル "{" 値
左中かっこ記号 ({) はマークアップ拡張シーケンスの開始を表すため、"{" で始まるリテラル文字列値を指定するには、エスケープ シーケンスを使う必要があります。 エスケープ シーケンスは "{}" です。 たとえば、単一の左中かっこを表す文字列値を指定するには、属性値を "{}{" と指定します。 このほか、"{" 値を文字列として指定するために、代替引用符 ("" で区切られた属性値内の ' など) を使うこともできます。
注: "\}" は、引用符で囲まれている属性の内側にある場合にも機能します。
列挙値
Windows ランタイム API の多くのプロパティは、列挙を値として使用します。 メンバーが読み取り/書き込みプロパティの場合は、属性値を指定することで、このようなプロパティを設定できます。 定数名の非修飾名を使用して、プロパティの値として使用する列挙値を識別します。 たとえば、XAML で UIElement.Visibility を設定する方法を次に示します: <Button Visibility="Visible"/>
。 ここでは、文字列としての "Visible" は、 Visibility 列挙型の名前付き定数 Visibleに直接マップされます。
- 修飾されたフォームを使用しないでください。機能しません。 たとえば、これは無効な XAML:
<Button Visibility="Visibility.Visible"/>
です。 - 定数の値は使用しないでください。 つまり、列挙型の定義方法に応じて明示的または暗黙的に存在する列挙型の整数値に依存しないでください。 動作しているように見えるかもしれませんが、XAML またはコードでは、一時的な実装の詳細に依存しているため、不適切な方法です。 たとえば、次の操作は行わないでください:
<Button Visibility="1"/>
。
注 XAML と列挙体を使う API のリファレンス トピックで、「構文」の「プロパティ値」セクションに表示される列挙型へのリンクをクリックします。 これにより、その列挙体の名前付き定数を検出できる列挙ページにリンクされます。
列挙型にはフラグを設定できます。つまり、 FlagsAttribute で属性付けされます。 フラグごとの列挙の値の組み合わせを XAML 属性値として指定する必要がある場合は、各列挙定数の名前を使用し、各名前の間にコンマ (,) を付け、スペース文字を挿入しません。 フラグごとの属性は、Windows ランタイム XAML ボキャブラリでは一般的ではありませんが、ManipulationModes は XAML でのフラグごとの列挙値の設定がサポートされている例です。
XAML のインターフェイス
まれに、プロパティの型がインターフェイスである XAML 構文が表示されます。 XAML 型システムでは、そのインターフェイスを実装する型は、解析時に値として許容されます。 値として使用できる、このような型の作成されたインスタンスが存在する必要があります。 ButtonBase の Command および CommandParameter プロパティの XAML 構文で型として使用されるインターフェイスが表示されます。 これらのプロパティは Model-View-ViewModel (MVVM) 設計パターンをサポートします。ここで、 ICommand インターフェイスは、ビューとモデルの対話方法のコントラクトです。
Windows ランタイム リファレンスの XAML プレースホルダー規則
XAML を使用できる Windows ランタイム API のリファレンス トピックの Syntax セクションのいずれかを調べた場合、構文には非常に多くのプレースホルダーが含まれていることが考えられます。 XAML 構文は使用構文であるため、C#、Microsoft Visual Basic、または Visual C++ コンポーネント拡張 (C++/CX) 構文とは異なります。 これは、独自の XAML ファイルでの最終的な使用方法を示唆していますが、使用できる値に過剰な規範を置く必要はありません。 そのため、通常、使用法はリテラルとプレースホルダーを組み合わせた文法の種類を記述し、 XAML Values セクションでプレースホルダーの一部を定義します。
プロパティの XAML 構文で型名/要素名が表示される場合、表示される名前は、最初にプロパティを定義した型に対するものです。 ただし、Windows ランタイム XAML では、DependencyObject ベースのクラスのクラス継承モデルがサポートされています。 そのため、多くの場合、定義クラスではなく、最初にプロパティ/属性を定義したクラスから派生したクラスに対して属性を使用できます。 たとえば、 Visibility UIElement 派生クラスの属性として、深い継承を使用して設定できます。 (例: <Button Visibility="Visible" />
)。 したがって、XAML 使用法構文に示されている要素名を文字どおり取りすぎないでください。構文は、そのクラスを表す要素と、派生クラスを表す要素に対しても実行可能な場合があります。 定義要素として示されている型が実際の使用法で使用されることはまれまたは不可能な場合、その型名は構文で意図的に小文字で記述されます。 たとえば、 UIElement.Visibility に表示される構文は次のとおりです。
<uiElement Visibility="Visible"/>
-or-
<uiElement Visibility="Collapsed"/>
多くの XAML 構文セクションには、Syntax セクションのすぐ下にある XAML Values セクションで定義される "Usage" のプレースホルダーが含まれています。
XAML の使用セクションでは、さまざまな一般化されたプレースホルダーも使用します。 これらのプレースホルダーは、 XAML 値で毎回再定義されるわけではありません。これは、これらのプレースホルダーが何を表すのかを推測するか、最終的に学習するためです。 ほとんどの読者は、 XAML 値で見ることにうんざりすると思います 何度も繰り返し、定義から除外しました。 参考までに、これらのプレースホルダーの一部と、一般的な意味での意味の一覧を次に示します。
- object: 理論的には任意のオブジェクト値ですが、多くの場合、文字列やオブジェクトの選択などの特定の種類のオブジェクトに制限されます。詳細については、リファレンス ページの「解説」を参照してください。
- object property: object property を組み合わせて使用すると、表示される構文が多くのプロパティの属性値として使用できる型の構文になります。 たとえば、Brush に表示される Xaml 属性の使用法には、<object property="predefinedColorName"/ が含まれます。>
- eventhandler: これは、イベント属性に対して表示されるすべての XAML 構文の属性値として表示されます。 ここで指定しているのは、イベント ハンドラー関数の関数名です。 その関数は、XAML ページの分離コードで定義する必要があります。 プログラミング レベルでは、その関数は、処理しているイベントのデリゲート シグネチャと一致する必要があります。そうしないと、アプリ コードがコンパイルされません。 しかし、これは実際にはプログラミング上の考慮事項であり、XAML の考慮事項ではないため、XAML 構文のデリゲート型について何もヒントを得ようとしません。 イベントに実装する必要があるデリゲートを知りたい場合は、イベントの参照トピックの Event 情報 セクションの、 Delegate というラベルが付いたテーブル行に含まれます。
- enumMemberName: すべての列挙型の属性構文に示されています。 列挙値を使用するプロパティにも同様のプレースホルダーがありますが、通常はプレースホルダーの前に列挙型の名前のヒントが付きます。 たとえば、FrameworkElement.FlowDirection で示される構文は、<frameworkElementFlowDirection="flowDirectionMemberName"/> です。 これらのプロパティ参照ページのいずれかを使用している場合は、テキスト Type: の横にある Property Value セクションに表示される列挙型へのリンクをクリックします。 その列挙を使用するプロパティの属性値には、Members リストの Member 列にリストされている任意の文字列を使用できます。
- double、 int、 string、 ブール: これらは XAML 言語で認識されるプリミティブ型です。 C# または Visual Basic を使用してプログラミングする場合、これらの型は、 Double、 Int32、 String 、 Boolean などの Microsoft .NET と同等の型に投影され、.NET コードビハインドで XAML で定義された値を操作するときに、それらの .NET 型のメンバーを使用できます。 C++/CX を使用してプログラミングする場合は、C++ プリミティブ型を使用しますが、 Platform 名前空間で定義されている型 ( Platform::String など) と同等の型を検討することもできます。 特定のプロパティに対して値の制限が追加される場合があります。 ただし、これらの制限はコードの使用と XAML の使用の両方に適用されるため、通常、これらは XAML セクションではなく、 Property 値 セクションまたは解説セクションに表示されます。
ヒントとテクニック、スタイルに関する注意事項
- マークアップ拡張については、一般に、メインの XAML の概要で説明します。 ただし、このトピックで説明するガイダンスに最も影響を与えるマークアップ拡張は、 StaticResource マークアップ拡張 (および関連 ThemeResource) です。 StaticResource マークアップ拡張機能の機能は、XAML ResourceDictionaryから取得された再利用可能なリソースに XAML を分解できるようにすることです。 ほとんどの場合、コントロール テンプレートと関連するスタイルは、 ResourceDictionaryで定義します。 多くの場合、コントロール テンプレート定義の小さい部分やアプリ固有のスタイルは、ResourceDictionary でも定義します。たとえば、アプリが UI のさまざまな部分に複数回使用する色の場合SolidColorBrush などです。 StaticResource を使用すると、設定するプロパティ要素の使用を必要とするプロパティを属性構文で設定できるようになりました。 ただし、再利用のために XAML を考慮する利点は、ページ レベルの構文を簡略化するだけではありません。 詳細については、「 ResourceDictionary および XAML リソース参照を参照してください。
- XAML の例では、空白と改行がどのように適用されるかについて、いくつかの異なる規則が表示されます。 特に、さまざまな属性が設定されているオブジェクト要素を分割する方法には、さまざまな規則があります。 それは単なるスタイルの問題です。 Visual Studio XML エディターでは、XAML を編集するときに既定のスタイル 規則がいくつか適用されますが、設定で変更できます。 XAML ファイル内の空白が重要と見なされるケースはごく少数です。詳しくは、 XAML と空白を参照してください。