第 8 章の概要: コードと XAML の調和
Note
この本は 2016 年春に発行されて以降、改訂されていません。 多くの情報はまだ価値がありますが、一部の資料は古くなっており、トピックの中にはまったく正しくないものまたは不完全なものもあります。
この章では、XAML をより深く掘り下げ、特にコードと XAML の連携方法について説明します。
引数の受け渡し
一般的なケースでは、XAML でインスタンス化されるクラスにはパラメーターなしのパブリック コンストラクターが必要です。生成されたオブジェクトは、プロパティの設定によって初期化されます。 ただし、オブジェクトをインスタンス化および初期化する方法は他にも 2 つあります。
これらは汎用的な手法ですが、ほとんどの場合、MVVM ビュー モデルと関連して使用されます。
引数を持つコンストラクター
ParameteredConstructorDemo サンプルでは、x:Arguments
タグを使用してコンストラクターの引数を指定する方法が示されています。 これらの引数は、引数の型を示す要素タグで区切る必要があります。 .NET の基本データ型の場合は、次のタグを使用できます。
x:Object
x:Boolean
x:Byte
x:Int16
x:Int32
x:Int64
x:Single
x:Double
x:Decimal
x:Char
x:String
x:TimeSpan
x:Array
x:DateTime
XAML からメソッドを呼び出すことはできますか?
FactoryMethodDemo サンプルでは、x:FactoryMethod
要素を使用して、オブジェクトを作成するために呼び出されるファクトリ メソッドを指定する方法が示されています。 このようなファクトリ メソッドは、パブリックかつ静的である必要があり、それが定義されている型のオブジェクトが作成される必要があります。 (たとえば、Color.FromRgb
メソッドは、パブリックかつ静的であり、Color
型の値を返すため、適切です。)ファクトリ メソッドの引数は x:Arguments
タグ内で指定されます。
x:Name 属性
x:Name
属性を使用すると、XAML でインスタンス化されたオブジェクトに名前を付けることができます。 この名前の規則は、C# の変数名の規則と同じです。 コンストラクターで InitializeComponent
呼び出しが返った後は、分離コード ファイルからこれらの名前を参照し、対応する XAML 要素にアクセスできます。 この名前は、実際には、XAML パーサーによって、生成された部分クラスのプライベート フィールドに変換されます。
XamlClock サンプルでは、x:Name
を使用し、分離コード ファイルにおいて XAML で定義されている 2 つの Label
要素を現在の日付と時刻に保つ方法が示されています。
同じページ上の複数の要素に同じ名前を使用することはできません。 これは、OnPlatform
を使用して、各プラットフォームに対して並列に名前付きオブジェクトを作成する場合に特に問題となります。 PlatformSpecificLabele サンプルは、そのような操作を行うためのより優れた方法を示しています。
XAML ベースのカスタム ビュー
XAML でマークアップの繰り返しを回避するには、いくつかの方法があります。 一般的な手法の 1 つは、ContentView
から派生する新しい XAML ベースのクラスを作成することです。 この手法は、ColorViewList サンプルで示されています。 ColorView
クラスは ContentView
から派生し、特定の色とその名前を表示します。一方、ColorViewListPage
クラスは通常どおり ContentPage
から派生し、明示的に ColorView
のインスタンスを 17 個作成します。
XAML で ColorView
クラスにアクセスするには、別の XML 名前空間宣言が必要です。これは通常、同じアセンブリ内のクラスのために local
と名付けれらます。
イベントとハンドラー
イベントは XAML のイベント ハンドラーに割り当てることができますが、そのイベント ハンドラー自体は分離コード ファイルで実装する必要があります。 XamlKeypad は、XAML でキーパッド ユーザー インターフェイスを構築する方法と、分離コード ファイルで Clicked
ハンドラーを実装する方法を示しています。
タップ ジェスチャ
View
オブジェクトでは、タッチ入力を取得し、その入力からイベントを生成することができます。 View
クラスでは GestureRecognizers
コレクション プロパティが定義されています。これには、GestureRecognizer
から派生したクラスのインスタンスを 1 つ以上含めることができます。
TapGestureRecognizer
によって Tapped
イベントが生成されます。 MonkeyTap プログラムは、TapGestureRecognizer
オブジェクトを 4 つの BoxView
要素にアタッチして、イミテーション ゲームを作成する方法を示しています。
ただし、実際には、MonkeyTap プログラムにはサウンドが必要です。 (次の章をご覧ください。)