次の方法で共有


第 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 プログラムにはサウンドが必要です。 (次の章をご覧ください。)