取り扱い者
.NET マルチプラットフォーム アプリ UI (.NET MAUI) には、データの表示、アクションの開始、アクティビティの示し、コレクションの表示、データの選択などを行うために使用できるクロスプラットフォーム コントロールのコレクションが用意されています。 各コントロールには、コントロールを抽象化するインターフェイス表現があります。 これらのインターフェイスを実装するクロスプラットフォーム コントロールは、仮想ビューと呼ばれます。 UIButton
にマップされます。 Android では、Button は MaterialButton
にマップされます。
.NET MAUI ハンドラーは、Buttonの IButton
など、コントロール固有のインターフェイスを介してアクセスされます。 これにより、クロスプラットフォーム コントロールがハンドラーを参照する必要が回避され、ハンドラーがクロスプラットフォーム コントロールを参照する必要がなくなります。
各ハンドラー クラスは、PlatformView
プロパティを使用してクロスプラットフォーム コントロールのネイティブ ビューを公開します。 このプロパティにアクセスして、ネイティブ ビュー プロパティの設定、ネイティブ ビュー メソッドの呼び出し、ネイティブ ビュー イベントのサブスクライブを行うことができます。 さらに、ハンドラーによって実装されるクロスプラットフォーム コントロールは、VirtualView
プロパティを介して公開されます。
ネイティブ ビューによって各プラットフォームで実装が提供されるクロスプラットフォーム コントロールを作成する場合は、クロスプラットフォーム コントロール API をネイティブ ビュー API にマップするハンドラーを実装する必要があります。 詳細については、「ハンドラーを使用してカスタム コントロールを作成する」を参照してください。
また、ハンドラーをカスタマイズして、コントロールの API を通じて可能なカスタマイズを超えて、既存のクロスプラットフォーム コントロールの外観と動作を強化することもできます。 このハンドラーのカスタマイズにより、クロスプラットフォーム コントロールのネイティブ ビューが変更されます。 ハンドラーはグローバルであり、コントロールのハンドラーをカスタマイズすると、同じ種類のすべてのコントロールがアプリでカスタマイズされます。 詳細については、「ハンドラーを使用して .NET MAUI コントロールをカスタマイズするを参照してください。
マッパー
.NET MAUI ハンドラーの主な概念は、マッパーです。 各ハンドラーは、通常、クロスプラットフォーム コントロールの API をネイティブ ビューの API にマップする、プロパティ マッパー(場合によっては コマンド マッパー) を提供します。
プロパティ マッパー は、クロスプラットフォーム コントロールでプロパティの変更が発生したときに実行するアクションを定義します。 これは、クロスプラットフォーム コントロールのプロパティを関連する Actions にマップする Dictionary
です。 その後、各プラットフォーム ハンドラーは、ネイティブ ビュー API を操作する Actions の実装を提供します。 これにより、クロスプラットフォーム コントロールでプロパティが設定されると、基になるネイティブ ビューが必要に応じて更新されます。
コマンド マッパー は、クロスプラットフォーム コントロールがネイティブ ビューにコマンドを送信するときに実行するアクションを定義します。 プロパティ マッパーに似ていますが、追加のデータを渡すことができます。 このコンテキストのコマンドは、ICommand 実装を意味するものではありません。 代わりに、コマンドは単なる命令であり、必要に応じてそのデータがネイティブ ビューに送信されます。 コマンド マッパーは、クロスプラットフォーム コントロールのコマンドを関連するアクションにマップする Dictionary
です。 各ハンドラーは、ネイティブ ビュー API を操作する Actions の実装を提供します。 これにより、クロスプラットフォーム コントロールがコマンドをネイティブ ビューに送信すると、必要に応じてネイティブ ビューが更新されます。 たとえば、ScrollView がスクロールされると、ScrollViewHandler
はコマンド マッパーを使用して、スクロール位置引数を受け入れる Action を呼び出します。 次に、アクションは、その位置までスクロールするように基になるネイティブ ビューに指示します。
ネイティブ ビューを更新するために マッパー を使用する利点は、ネイティブ ビューをクロスプラットフォーム コントロールから切り離すことができる点です。 これにより、クロスプラットフォーム コントロール イベントのサブスクライブとサブスクライブ解除をネイティブ ビューで行う必要がなくなります。 また、サブクラス化せずにマッパーを変更できるため、簡単にカスタマイズできます。
ハンドラーのライフサイクル
すべてのハンドラー ベースの .NET MAUI コントロールは、次の 2 つのハンドラー ライフサイクル イベントをサポートします。
-
HandlerChanging
は、クロスプラットフォーム コントロール用に新しいハンドラーが作成されようとしているとき、および既存のハンドラーがクロスプラットフォーム コントロールから削除されるときに発生します。 このイベントに付随するHandlerChangingEventArgs
オブジェクトには、IElementHandler
型のNewHandler
プロパティとOldHandler
プロパティがあります。NewHandler
プロパティがnull
されていない場合、イベントはクロスプラットフォーム コントロール用に新しいハンドラーが作成されようとしていることを示します。OldHandler
プロパティがnull
されていない場合、イベントは、既存のネイティブ コントロールがクロスプラットフォーム コントロールから削除されようとしていることを示します。そのため、ネイティブ イベントはすべて未接続にし、その他のクリーンアップを実行する必要があります。 -
HandlerChanged
は、クロスプラットフォーム コントロールのハンドラーが作成された後に発生します。 このイベントは、クロスプラットフォーム コントロールを実装するネイティブ コントロールが使用可能であり、クロスプラットフォーム コントロールに設定されているすべてのプロパティ値がネイティブ コントロールに適用されていることを示します。
手記
HandlerChanging
イベントは、HandlerChanged
イベントの前にクロスプラットフォーム コントロールで発生します。
これらのイベントに加えて、各クロスプラットフォーム コントロールには、HandlerChanging
イベントが発生したときに呼び出されるオーバーライド可能な OnHandlerChanging
メソッドと、HandlerChanged
イベントが発生したときに呼び出される OnHandlerChanged
メソッドもあります。
ハンドラーの表示
次の表に、.NET MAUI でビューを実装する型を示します。
ページ ハンドラー
次の表に、.NET MAUI でページを実装する型を示します。
ページ | Android ハンドラー | iOS/Mac Catalyst ハンドラー | Windows ハンドラー | プロパティ マッパー | コマンド マッパー |
---|---|---|---|---|---|
ContentPage | PageHandler | PageHandler | PageHandler | Mapper | CommandMapper |
FlyoutPage | FlyoutViewHandler | PhoneFlyoutPageRenderer | FlyoutViewHandler | Mapper |
CommandMapper |
NavigationPage | NavigationViewHandler | NavigationRenderer | NavigationViewHandler | Mapper |
CommandMapper |
TabbedPage | TabbedViewHandler | タブ付きレンダラー (TabbedRenderer) | TabbedViewHandler | Mapper |
CommandMapper |
Shell | ShellHandler |
シェルレンダラー | ShellRenderer | Mapper |
CommandMapper |
.NET MAUI