处理程序
.NET Multi-platform App UI (.NET MAUI) 提供跨平台控件集合,可用于显示数据、启动操作、指示活动、显示集合、选取数据等。 每个控件都有提取控件的接口表示形式。 实现这些接口的跨平台控件称为虚拟视图。 处理程序将这些虚拟视图映射到每个平台上的控件,也就是本机视图。 处理程序还负责实例化基础本机视图,并将跨平台控件 API 映射到本机视图 API。 例如,在 iOS 上,处理程序将 .NET MAUI Button 映射到 iOS UIButton
。 在 Android 上,则是将 Button 映射到 AppCompatButton
:
访问 .NET MAUI 处理程序的途径是通过其特定于控件的接口(例如 Button 的 IButton
)。 这样可以避免跨平台控件必须引用其处理程序,而处理程序必须引用跨平台控件。
每个处理程序类通过其 PlatformView
属性公开跨平台控件的本机视图。 可以访问此属性以设置本机视图属性、调用本机视图方法和订阅本机视图事件。 此外,处理程序实现的跨平台控件通过其 VirtualView
属性公开。
创建跨平台控件时,其实现由本机视图在每个平台上提供,应实现将跨平台控件 API 映射到本机视图 API 的处理程序。 有关详细信息,请参阅使用处理程序创建自定义控件。
还可以自定义处理程序,以增强现有跨平台控件的外观和行为,而不仅仅是通过控件的 API 进行自定义。 此处理程序自定义修改跨平台控件的本机视图。 处理程序是全局的,自定义控件的处理程序将导致自定义应用中同一类型的所有控件。 有关详细信息,请参阅使用处理程序自定义 .NET MAUI 控件。
映射器
.NET MAUI 处理程序的关键概念是映射器。 每个处理程序通常都提供属性映射器,有时提供命令映射器,用于将跨平台控件的 API 映射到本机视图的 API。
属性映射器定义在跨平台控件中发生属性更改时要执行的操作。 它是 Dictionary
,用于将跨平台控件的属性映射到其关联的操作。 然后,每个处理程序都提供操作的实现,用于操作本机视图 API。 这可确保在跨平台控件上设置属性时,基础本机视图会根据需要进行更新。
命令映射器定义跨平台控件向本机视图发送命令时要执行的操作。 它们类似于属性映射器,但允许传递额外的数据。 此上下文中的命令并不意味着 ICommand 实现。 实际上,命令只是发送到本机视图的指令及其数据(可选)。 命令映射器是 Dictionary
,用于将跨平台控件的命令映射到其关联的操作。 然后,每个处理程序都提供操作的实现,用于操作本机视图 API。 这可确保跨平台控件将命令发送到其本机视图时,会根据需要更新本机视图。 例如,滚动 ScrollView 时,ScrollViewHandler
使用命令映射器调用接受滚动位置参数的操作。 然后,该操作指示基础本机视图滚动到该位置。
使用映射器更新本机视图的优势在于,可以将本机视图与跨平台控件分离。 这样就不需要本机视图订阅和取消订阅跨平台控制事件。 它还允许轻松进行自定义,因为无需子类化即可修改映射器。
处理程序生命周期
所有基于处理程序的 .NET MAUI 控件都支持两个处理程序生命周期事件:
- 在从跨平台控件中删除现有处理程序之前,以及在创建跨平台控件的新处理程序之前,将引发
HandlerChanging
事件。 此事件附带的HandlerChangingEventArgs
对象具有类型为IElementHandler
的NewHandler
和OldHandler
属性。 如果NewHandler
属性不为null
,则该事件指示即将为跨平台控件新建处理程序。 如果OldHandler
属性不是null
,则该事件指示现有本机控件即将从跨平台控件中删除,因此应取消连接任何本机事件并执行其他清理。 - 为跨平台控件创建处理程序后将引发
HandlerChanged
。 此事件指示实现跨平台控件的本机控件可用,并且跨平台控件上设置的所有属性值都已应用于本机控件。
注意
在跨平台控件上,HandlerChanging
事件是先于 HandlerChanged
事件引发的。
除了这些事件,每个跨平台控件还具有在 HandlerChanging
事件引发时调用的可替代 OnHandlerChanging
方法,以及在 HandlerChanged
事件引发时调用的 OnHandlerChanged
方法。
查看处理程序
下表列出了在 .NET MAUI 中实现视图的类型:
页面处理程序
下表列出了在 .NET MAUI 中实现页面的类型:
页 | Android 处理程序 | iOS/Mac 催化剂处理程序 | Windows 处理程序 | 属性映射器 | 命令映射器 |
---|---|---|---|---|---|
ContentPage | PageHandler | PageHandler | PageHandler | Mapper | CommandMapper |
FlyoutPage | FlyoutViewHandler | 电话FlyoutPageRenderer | FlyoutViewHandler | Mapper |
CommandMapper |
NavigationPage | NavigationViewHandler | NavigationRenderer | NavigationViewHandler | Mapper |
CommandMapper |
TabbedPage | TabbedViewHandler | TabbedRenderer | TabbedViewHandler | Mapper |
CommandMapper |
Shell | ShellHandler |
ShellRenderer | ShellRenderer | Mapper |
CommandMapper |