效果简介

借助效果可对每个平台上的本机控件进行自定义,通常用于细微的样式更改。 本文对效果进行了介绍,概述了效果和自定义呈现器之间的区别,并介绍了 PlatformEffect 类。

Xamarin.Forms页面、布局和控件提供常见的 API,用于描述跨平台的移动用户界面。 通过 Renderer 类可以在每个平台上以不同方式呈现每个页面、布局和控件,此操作反过来又可以创建本机控件(对应于 Xamarin.Forms 表示形式),在屏幕上排列该控件,并添加共享代码中指定的行为。

开发人员可以实现自定义 Renderer 类,以自定义控件的外观和/或行为。 但是,实现自定义呈现器类以执行简单的控件自定义通常是大型响应。 效果简化了此过程,可以更轻松地自定义每个平台上的本机控件。

通过子类化 PlatformEffect 控件在特定于平台的项目中创建效果,然后通过将它们附加到 Xamarin.Forms .NET 标准库或共享库项目中的适当控件来使用效果。

为什么要在自定义呈现器上使用效果?

效果简化了控件的自定义、可重用并且可以通过参数化进一步增加重用。

任何可以使用效果达成的事情也可以使用自定义呈现器达成。 但是,自定义呈现器提供比效果更多的灵活性和自定义。 以下指南列出了在自定义呈现器上选择效果的情况:

  • 当更改特定于平台的控件的属性能达成所需结果时,建议使用效果。
  • 当需要替代特定于平台的控件的方法时,需要使用自定义呈现器。
  • 当需要替换实现 Xamarin.Forms 控件的特定于平台的控件时,需要使用自定义呈现器。

子类化 PlatformEffect 类

下表列出了 PlatformEffect 类在每个平台上的命名空间,以及其属性的类型:

平台 命名空间 容器 控制
iOS Xamarin.Forms.Platform.iOS UIView UIView
Android Xamarin.Forms.Platform.Android ViewGroup 视图
通用 Windows 平台 (UWP) Xamarin.Forms.Platform.UWP FrameworkElement FrameworkElement

每个特定于平台的 PlatformEffect 类都公开以下属性:

  • Container – 引用用于实现布局的特定于平台的控件。
  • Control - 引用用于实现 Xamarin.Forms 控件的特定于平台的控件。
  • Element - 引用正在呈现的 Xamarin.Forms 控件。

效果没有它们附加到的容器、控件或元素的类型信息,因为它们可以附加到任何元素。 因此,当效果附加到它不支持的元素时,它应该适当地降级或引发异常。 但是,ContainerControlElement 属性可以强制转换为其实现的类型。 若要详细了解这些类型,请参阅呈现器基类和本机控件

每个特定于平台的 PlatformEffect 类都公开以下方法,必须替代这些方法以实现效果:

  • OnAttached - 效果附加到 Xamarin.Forms 控件时调用。 在每个特定于平台的效果类中,此方法的替代版本是执行控件自定义的位置,以及在效果无法应用于指定的 Xamarin.Forms 控件的情况下的异常处理。
  • OnDetached - 效果自 Xamarin.Forms 控件分离时调用。 在每个特定于平台的效果类中,此方法的替代版本是执行任何效果清除的位置,例如取消注册事件处理程序。

此外,PlatformEffect 公开了 OnElementPropertyChanged 方法,该方法也可以被替代。 当该元素的属性发生更改时,调用此方法。 在每个特定于平台的效果类中,此方法的替代版本是响应 Xamarin.Forms 控件上的可绑定属性更改的位置。 应始终检查已更改的属性,因为可多次调用此替代。