x:Static のマークアップ拡張機能

共通言語仕様 (CLS: Common Language Specification) に準拠した方法で定義されている静的な値渡しのコード エンティティを参照します。 参照されている静的プロパティを使用して、XAML でプロパティの値を指定できます。

XAML 属性の使用方法

<object property="{x:Static prefix:typeName.staticMemberName}" .../>

XAML 値

prefix 省略可能。 マップされた既定ではない XAML 名前空間を参照するプレフィックス。 既定の XAML 名前空間に含まれる静的なプロパティを参照することはほとんどないため、使用するときに prefix を明示的に示します。 「解説」を参照してください。
typeName 必須です。 目的の静的メンバーを定義する型の名前。
staticMemberName 必須です。 目的の静的な値のメンバーの名前 (定数、静的プロパティ、フィールド、または列挙値)。

Remarks

参照されるコード エンティティは、次のいずれかである必要があります。

  • 定数
  • 静的プロパティ
  • フィールド
  • 列挙値

非静的なプロパティなど、他のコード エンティティを指定すると、XAML がマークアップでコンパイルされる場合はコンパイル時エラーが発生し、それ以外の場合は XAML の読み込み時に解析例外が発生します。

現在の XAML ドキュメントの既定の XAML 名前空間に含まれない静的なフィールドまたはプロパティを、x:Static で参照することができます。ただし、これにはプレフィックスのマッピングが必要です。 XAML 名前空間は、ほとんどの場合、XAML ドキュメントのルート要素で定義されます。

静的プロパティの参照操作は、.NET XAML サービスおよびその XAML リーダーと XAML ライターが既定の XAML スキーマ コンテキストで実行されている場合は、それらを使用して実行できます。 この XAML スキーマ コンテキストで CLR リフレクションを使用して、オブジェクト グラフの構築に必要な静的な値を提供できます。 指定する typeName は、実際には CLR の型名ではなく、XAML の型名です。ただし、既定の XAML スキーマ コンテキストを使用しているとき、または既存のすべての CLR ベースの XAML 実装フレームワークを使用しているときは、これらは基本的に同じ名前になります。

プロパティの値の型をx:Static で直接参照しない場合は、注意してください。 XAML 処理シーケンスにおいては、マークアップ拡張から提供された値により、追加の値変換が呼び出されることはありません。 これは、x:Static 参照によってテキスト文字列が作成される場合にも当てはまります。テキスト文字列に基づく属性値の値変換は、通常、その特定のメンバーまたは戻り値の型のメンバー値に対して行われます。

属性構文は、このマークアップ拡張機能で使用される最も一般的な構文です。 x:Static 識別子文字列の後に設定される文字列トークンは、基になる Member 拡張クラスの StaticExtension 値として割り当てられます。

技術的に可能な XAML の使用方法が他に 2 つあります。 ただし、これらの使用方法は、不必要に冗長であるため、あまり一般的ではありません。

  1. オブジェクト要素構文。

    <x:Static Member="prefix:typeName.staticMemberName" ... />
    
  2. 初期化文字列用の明示的な Member プロパティが含まれる属性構文。

    <object property="{x:Static Member=prefix:typeName.staticMemberName}" ... />
    

.NET XAML サービスの実装では、このマークアップ拡張の処理は StaticExtension クラスによって定義されています。

x:Static はマークアップ拡張機能です。 XAML のすべてのマークアップ拡張では、属性構文において文字 {} が使用されます。これは規約であり、それによって XAML プロセッサでは、マークアップ拡張で値を提供する必要があることが認識されます。 マークアップ拡張機能について詳しくは、「 Markup Extensions for XAML Overview」をご覧ください。

WPF の使用上の注意

WPF のプログラミングに使用する既定の XAML 名前空間には、役に立つ静的プロパティはあまり含まれていません。便利な静的プロパティのほとんどには、{x:Static} を必要としない使用を容易にする型コンバーターなどのサポートがあります。 静的プロパティの場合、次のいずれかに該当するときは、XAML 名前空間のプレフィックスをマップする必要があります。

  • WPF には存在するが、WPF (http://schemas.microsoft.com/winfx/2006/xaml/presentation) の既定の XAML 名前空間の一部ではない型を参照しています。 これは、x:Static を使用している場合によくあることです。 たとえば、Environment クラスの静的プロパティを参照するために、System CLR 名前空間と mscorlib アセンブリへの XAML 名前空間マッピングで x:Static 参照を使用することがあります。

  • カスタム アセンブリから型を参照しています。

  • WPF アセンブリに存在する型を参照していますが、その型は、WPF の既定の XAML 名前空間の一部としてマップされていない CLR 名前空間内にあります。 WPF の既定の XAML 名前空間への CLR 名前空間のマッピングは、さまざまな WPF アセンブリでの定義によって実行されます (この概念について詳しくは、「XAML 名前空間および WPF XAML の名前空間の割り当て」をご覧ください)。 マップされていない CLR 名前空間は、その CLR 名前空間が通常は XAML 用でないクラス定義 (System.Windows.Threading など) で主に構成されている場合に、存在する可能性があります。

WPF でプレフィックスと XAML 名前空間を使用する方法について詳しくは、「XAML 名前空間および WPF XAML の名前空間の割り当て」をご覧ください。

関連項目