.NET 多平台应用程序 UI(.NET MAUI)提供了一系列跨平台控件,用于显示数据、触发动作、指示活动等。每个控件都有一个接口表示,用于抽象化控件。实现这些接口的跨平台控件称为_虚拟视图_。处理器_将这些虚拟视图映射到每个平台上的控件,这些控件被称为_原生视图。例如,在 iOS 上,处理程序会将 .NET MAUI Button 对应到 iOS UIButton;在 Android 上,Button 会对应到 MaterialButton。
.NET MAUI 处理程序可以通过其特定控件接口来访问,例如 IButton 对应于 Button。这避免了跨平台控件必须引用其处理程序,而处理程序必须引用跨平台控件。
每个处理程序类都会通过其 PlatformView 属性公开跨平台控件的原生视图。您可以访问这个属性来设置原生视图属性、调用原生视图方法以及订阅原生视图事件。此外,处理程序实现的跨平台控件会通过其 VirtualView 属性公开。
当您创建跨平台控件,其实现是由原生视图在每个平台上提供时,您应该实现将跨平台控件 API 映射到原生视图 API 的处理程序。有关详细信息,请参阅使用处理程序创建自定义控件。
您也可以自定义处理程序,以增强现有跨平台控件的外观和行为,而无法通过控件的 API 进行自定义。此处理程序自定义会修改跨平台控件的原生视图。处理程序是全局的,当自定义一个控件的处理程序时,应用程序中所有相同类型的控件都会被自定义。有关详细信息,请参阅使用处理程序自定义 .NET MAUI 控件。
映射器
.NET MAUI 处理程序的一个关键概念是映射器。每个处理程序通常会提供_属性映射器_,有时是_命令映射器_,将跨平台控件的 API 映射到原生视图的 API。
_属性映射器_定义跨平台控件中发生属性变更时要采取的动作。这是一个将跨平台的控件属性映射到其相关动作的 Dictionary。接着,每个平台处理程序都会提供动作的实现,以操作原生视图 API。这确保在跨平台控件上设置属性时,底层的原生视图会根据需要被更新。
_命令映射器_定义跨平台控件将命令发送到原生视图时要采取的动作。它们类似于属性映射器,但允许传递额外数据。在此情境中的指令并不意味着 ICommand 实现。相反地,命令只是一个指令,并且可以选择性地将其数据传送到本地视图。命令映射器是 Dictionary,它将跨平台控制的命令映射到相关联的操作。接着,每个处理程序都会提供动作的实现,以操作原生视图 API。这确保当跨平台控件将命令发送到其原生视图时,会视需要更新原生视图。例如,当滚动 ScrollView 时,ScrollViewHandler 会使用指令映射器来调用一个接受滚动位置参数的 Action,从而指示底层原生视图滚动到该位置。
使用_映射器_来更新原生视图的优点是,原生视图可以从跨平台控件中分离。这样就不需要原生视图订阅和取消订阅跨平台控件事件。它也允许您轻松自定义,因为映射器可以在不需要进行子类化的情况下进行修改。
处理程序生命周期
以处理程序为基础的所有 .NET MAUI 控件都支持两个处理程序生命周期事件:
- 当即将为跨平台控件创建新的处理程序,以及即将从跨平台控件中移除现有的处理程序时,就会引发 HandlerChanging。此事件随附的 HandlerChangingEventArgs 对象具有 NewHandler 和 OldHandler 属性,这些属性属于 IElementHandler 类型。当 NewHandler 属性不是 null 时,表示即将为跨平台控件创建新的处理程序;当 OldHandler 属性不为 null 时,表示现有的原生控件即将被移除,应解除绑定任何原生事件处理程序并执行清理。
- 跨平台控件的处理程序创建后,就会触发 HandlerChanged。这个事件表示实现跨平台控件的原生控件可供使用,且所有属性值已应用到原生控件。
注意:HandlerChanged 事件之前会先引发 HandlerChanging 事件。
除了这些事件,每个跨平台控件还有可覆写的 OnHandlerChanging 和 OnHandlerChanged 方法,分别在对应事件引发时调用。
视图处理程序
下表列出在 .NET MAUI 中实现视图的类型。
页面处理程序
下表列出在 .NET MAUI 中实现页面的类型。