第 10 章の概要: XAML マークアップ拡張機能

Note

この本は 2016 年春に発行されて以降、改訂されていません。 多くの情報はまだ価値がありますが、一部の資料は古くなっており、トピックの中にはまったく正しくないものまたは不完全なものもあります。

通常、XAML パーサーでは、基本的な .NET データ型の標準変換に基づいて、あるいはプロパティまたはその型に TypeConverterAttribute でアタッチされている TypeConverter 派生物に基づいて、属性値として設定されている文字列が、プロパティの型に変換されます。

しかし、ディクショナリ内の項目、静的なプロパティやフィールドの値、または何らかの種類の計算など、別のソースから属性を設定すると便利な場合があります。

これは、"XAML マークアップ拡張" の仕事です。 その名前にかかわらず、XAML マークアップ拡張は XML に対する拡張機能では "ありません"。 XAML は常に正規の XML です。

コード インフラストラクチャ

XAML マークアップ拡張は、IMarkupExtension インターフェイスを実装するクラスです。 そのようなクラスでは、多くの場合、名前の末尾に Extension という単語が付いていますが、XAML では通常はそのサフィックスなしで使用されます。

次の XAML マークアップ拡張は、XAML のすべての実装でサポートされています。

次の 4 つの XAML マークアップ拡張は、Xamarin.Forms を含む XAML の多くの実装でサポートされています。

Xamarin.Forms には、RelativeLayout に関連する追加の XAML マークアップ拡張が含まれます。

静的メンバーへのアクセス

属性を、パブリック静的プロパティ、フィールド、または列挙型のメンバーの値に設定するには、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 を使用すると、ディクショナリ キーへのリンクが保持され、キーによって参照されている項目が変更されるとターゲットが更新されます。

StaticResourceDynamicResource の違いについては、DynamicVsStatic サンプルを参照してください。

第11章バインド可能なインフラストラクチャ」で説明されているように、DynamicResource によって設定されるプロパティは、バインド可能なプロパティによって裏付けられている必要があります。

あまり使用されないマークアップ拡張

プロパティを null に設定するには、x:Null マークアップ拡張を使用します。

プロパティを .NET の Type オブジェクトに設定するには、x:Type マークアップ拡張を使用します。

配列を定義するには、x:Array を使用します。 [Type] プロパティを x:Type マークアップ拡張に設定することで、配列メンバーの型を指定します。

カスタム マークアップ拡張

IMarkupExtension インターフェイスと ProvideValue メソッドを実装するクラスを記述することで、独自の XAML マークアップ拡張を作成できます。

それらの要件は、HslColorExtension クラスによって満たされます。 それでは、HSLA という名前のプロパティの値に基づいて、Color 型の値が作成されます。 このクラスは、本書を通して構築されて使用される Xamarin.FormsBook.Toolkit という名前の Xamarin.Forms ライブラリの最初の項目です。

CustomExtensionDemo サンプルでは、このライブラリを参照し、カスタム マークアップ拡張を使用する方法が示されています。