第 10 章の概要: XAML マークアップ拡張機能
Note
この本は 2016 年春に発行されて以降、改訂されていません。 多くの情報はまだ価値がありますが、一部の資料は古くなっており、トピックの中にはまったく正しくないものまたは不完全なものもあります。
通常、XAML パーサーでは、基本的な .NET データ型の標準変換に基づいて、あるいはプロパティまたはその型に TypeConverterAttribute
でアタッチされている TypeConverter
派生物に基づいて、属性値として設定されている文字列が、プロパティの型に変換されます。
しかし、ディクショナリ内の項目、静的なプロパティやフィールドの値、または何らかの種類の計算など、別のソースから属性を設定すると便利な場合があります。
これは、"XAML マークアップ拡張" の仕事です。 その名前にかかわらず、XAML マークアップ拡張は XML に対する拡張機能では "ありません"。 XAML は常に正規の XML です。
コード インフラストラクチャ
XAML マークアップ拡張は、IMarkupExtension
インターフェイスを実装するクラスです。 そのようなクラスでは、多くの場合、名前の末尾に Extension
という単語が付いていますが、XAML では通常はそのサフィックスなしで使用されます。
次の XAML マークアップ拡張は、XAML のすべての実装でサポートされています。
StaticExtension
によってサポートされるx:Static
ReferenceExtension
によってサポートされるx:Reference
TypeExtension
によってサポートされるx:Type
NullExtension
によってサポートされるx:Null
ArrayExtension
によってサポートされるx:Array
次の 4 つの XAML マークアップ拡張は、Xamarin.Forms を含む XAML の多くの実装でサポートされています。
StaticResourceExtension
によってサポートされるStaticResource
DynamicResourceExtension
によってサポートされるDynamicResource
BindingExtension
によってサポートされるBinding
- 以下を参照: 第 16 章データ バインディングTemplateBindingExtension
によってサポートされるTemplateBinding
- 本書では説明されていません
Xamarin.Forms には、RelativeLayout
に関連する追加の XAML マークアップ拡張が含まれます。
ConstraintExpression
-本書では説明されていません
静的メンバーへのアクセス
属性を、パブリック静的プロパティ、フィールド、または列挙型のメンバーの値に設定するには、x:Static
要素を使用します。 Member
プロパティを静的メンバーに設定します。 通常は、中かっこで x:Static
とメンバー名を指定する方が簡単です。 Member
プロパティの名前を含める必要はありません。、メンバー自体だけで十分です。 この一般的な構文については、SharedStatics サンプルを参照してください。 静的フィールド自体は、AppConstants
クラスで定義されています。 この手法を使用すると、プログラム全体で使用される定数を設定できます。
XML 名前空間の宣言を追加することで、.NET Framework で定義されているパブリック静的プロパティ、フィールド、または列挙メンバーを参照できます。これについては、SystemStatics サンプルを参照してください。
リソース ディクショナリ
VisualElement
クラスで定義されている Resources
という名前のプロパティは、ResourceDictionary
型のオブジェクトに設定できます。 XAML 内では、このディクショナリに項目を格納し、x:Key
属性で識別できます。 リソース ディクショナリに格納されている項目は、その項目へのすべての参照間で共有されます。
ほとんどの目的に対する StaticResource
ほとんどの場合、StaticResource
マークアップ拡張を使用して、リソース ディクショナリから項目を参照します。これについては、ResourceSharing サンプルを参照してください。 中かっこ内では StaticResourceExtension
要素または StaticResource
を使用できます。
x:Static
マークアップ拡張と StaticResource
マークアップ拡張を混同しないようにしてください。
ディクショナリのツリー
XAML パーサーでは、StaticResource
が検出されると、ビジュアル ツリーでの一致するキーの検索が開始され、その後アプリケーションの App
クラスの ResourceDictionary
が検索されます。 これにより、ビジュアル ツリー内のでより深いリソース ディクショナリの項目で、ビジュアル ツリーの上位のリソース ディクショナリをオーバーライドできます。 これについては、ResourceTrees サンプルを参照してください。
特別な目的に対する DynamicResource
InitializeComponent
の呼び出しの間にビジュアル ツリーが作成されるときに、StaticResource
マークアップ拡張によってディクショナリから項目が取得されます。 StaticResource
の代わりに DynamicResource
を使用すると、ディクショナリ キーへのリンクが保持され、キーによって参照されている項目が変更されるとターゲットが更新されます。
StaticResource
と DynamicResource
の違いについては、DynamicVsStatic サンプルを参照してください。
「第11章バインド可能なインフラストラクチャ」で説明されているように、DynamicResource
によって設定されるプロパティは、バインド可能なプロパティによって裏付けられている必要があります。
あまり使用されないマークアップ拡張
プロパティを null
に設定するには、x:Null
マークアップ拡張を使用します。
プロパティを .NET の Type
オブジェクトに設定するには、x:Type
マークアップ拡張を使用します。
配列を定義するには、x:Array
を使用します。 [Type
] プロパティを x:Type
マークアップ拡張に設定することで、配列メンバーの型を指定します。
カスタム マークアップ拡張
IMarkupExtension
インターフェイスと ProvideValue
メソッドを実装するクラスを記述することで、独自の XAML マークアップ拡張を作成できます。
それらの要件は、HslColorExtension
クラスによって満たされます。 それでは、H
、S
、L
、A
という名前のプロパティの値に基づいて、Color
型の値が作成されます。 このクラスは、本書を通して構築されて使用される Xamarin.FormsBook.Toolkit という名前の Xamarin.Forms ライブラリの最初の項目です。
CustomExtensionDemo サンプルでは、このライブラリを参照し、カスタム マークアップ拡張を使用する方法が示されています。