摘要:第 27 章. 自定义呈现器

注意

本书于 2016 年春季出版,之后再未更新。 书中有许多内容仍然有价值,但有些内容已过时,有些主题不再完全正确或完整。

Xamarin.Forms 元素(如 Button)是通过在名为 ButtonRenderer 的类中封装的特定于平台的按钮呈现的。 例如,iOS 版 ButtonRendererAndroid 版 ButtonRenderer 以及 UWP 版 ButtonRenderer

本章介绍如何编写自己的呈现器来创建可映射到特定于平台的对象的自定义视图。

完整的类层次结构

有四个程序集包含 Xamarin.Forms 特定于平台的代码。 可以访问以下链接,查看 GitHub 上的源代码:

注意

本书中提到的 WinRT 程序集不再作为此解决方案的一部分。

PlatformClassHierarchy 示例展示了能有效执行平台的程序集的类层次结构。

你会注意到有一个名为 ViewRenderer 的重要类。 这是在创建特定于平台的呈现器时派生的那个类。 它存在三种不同的版本,因为它与目标平台的视图系统紧密关联:

iOS 版 ViewRenderer<TView, TNativeView> 具有以下泛型参数:

Android 版 ViewRenderer<TView, TNativeView> 具有以下泛型参数:

UWP 版 ViewRenderer<TElement, TNativeElement> 具有不同的命名泛型参数:

编写呈现器时,将从 View 派生一个类,然后编写多个 ViewRenderer 类(每个受支持的平台一个)。 每个特定于平台的实现都将引用一个本机类,该类派生自你指定为 TNativeViewTNativeElement 参数的类型。

初识自定义呈现器

HelloRenderers 程序引用它自己的 App 类中名为 HelloView 的自定义视图。

HelloView 类包含在 HelloRenderers 项目中,它只派生自 View

HelloRenderers.iOS 项目中的 HelloViewRenderer 类派生自 ViewRenderer<HelloView, UILabel>。 在 OnElementChanged 重写中,它创建了一个本机 iOS UILabel 并调用 SetNativeControl

HelloRenderers.Droid 项目中的 HelloViewRenderer 类派生自 ViewRenderer<HelloView, TextView>。 在 OnElementChanged 重写中,它创建了一个 Android TextView 并调用 SetNativeControl

HelloRenderers.UWP 中的 HelloViewRenderer 类以及其他 Windows 项目均派生自 ViewRenderer<HelloView, TextBlock>。 在 OnElementChanged 重写中,它创建了一个 Windows TextBlock 并调用 SetNativeControl

所有 ViewRenderer 导数都包含程序集级别的 ExportRenderer 属性,该属性将 HelloView 类与特定 HelloViewRenderer 类相关联。 下面是 Xamarin.Forms 在各个平台项目中定位呈现器的示例:

Hello 视图的三倍屏幕截图

呈现器和属性

下一组呈现器实现了椭圆绘图,它们位于 Xamarin.FormsBook.Platform 解决方案的不同项目中。

EllipseView 类位于 Xamarin.FormsBook.Platform 平台中。 此类与 BoxView 类似,只定义了一个属性:Color 类型的 Color

呈现器可以通过重写呈现器中的 OnElementPropertyChanged 方法,将为 View 设置的属性值传输到本机对象。 在此方法中(并且在大多数呈现器中),可以使用两个属性:

  • Element,Xamarin.Forms 元素
  • Control,本机视图、小组件或控件对象

这些属性的类型由 ViewRenderer 的泛型参数确定。 在本例中,ElementEllipseView 类型。

因此,OnElementPropertyChanged 重写可以通过某种转换将 ElementColor 值传输到本机 Control 对象。 三个呈现器如下所示:

EllipseDemo 类将显示以下几个 EllipseView 对象:

椭圆演示的三倍屏幕截图

BouncingBallEllipseView 弹离屏幕边缘。

呈现器和事件

呈现器也可以间接生成事件。 StepSlider 类与正常的 Xamarin.FormsSlider 类似,但前者允许在 MinimumMaximum 值之间指定多个不连续的阶段。

三个呈现器如下所示:

呈现器检测对本机控件的更改,然后调用 SetValueFromRenderer,这会引用在 StepSlider 中定义的可绑定属性,这种更改将导致 StepSlider 触发 ValueChanged 事件。

StepSliderDemo 示例展示了此新滑块。