摘要:第 27 章. 自定义呈现器
注意
本书于 2016 年春季出版,之后再未更新。 书中有许多内容仍然有价值,但有些内容已过时,有些主题不再完全正确或完整。
Xamarin.Forms 元素(如 Button
)是通过在名为 ButtonRenderer
的类中封装的特定于平台的按钮呈现的。 例如,iOS 版 ButtonRenderer
、Android 版 ButtonRenderer
以及 UWP 版 ButtonRenderer
。
本章介绍如何编写自己的呈现器来创建可映射到特定于平台的对象的自定义视图。
完整的类层次结构
有四个程序集包含 Xamarin.Forms 特定于平台的代码。 可以访问以下链接,查看 GitHub 上的源代码:
- Xamarin.Forms.Platform(极小型)
- Xamarin.Forms.Platform.iOS
- Xamarin.Forms.Platform.Android
- Xamarin.Forms.Platform.UAP
注意
本书中提到的 WinRT
程序集不再作为此解决方案的一部分。
PlatformClassHierarchy 示例展示了能有效执行平台的程序集的类层次结构。
你会注意到有一个名为 ViewRenderer
的重要类。 这是在创建特定于平台的呈现器时派生的那个类。 它存在三种不同的版本,因为它与目标平台的视图系统紧密关联:
iOS 版 ViewRenderer<TView, TNativeView>
具有以下泛型参数:
TView
仅用于Xamarin.Forms.View
TNativeView
仅用于UIKit.UIView
Android 版 ViewRenderer<TView, TNativeView>
具有以下泛型参数:
TView
仅用于Xamarin.Forms.View
TNativeView
仅用于Android.Views.View
UWP 版 ViewRenderer<TElement, TNativeElement>
具有不同的命名泛型参数:
TElement
仅用于Xamarin.Forms.View
TNativeElement
仅用于Windows.UI.Xaml.FrameworkElement
编写呈现器时,将从 View
派生一个类,然后编写多个 ViewRenderer
类(每个受支持的平台一个)。 每个特定于平台的实现都将引用一个本机类,该类派生自你指定为 TNativeView
或 TNativeElement
参数的类型。
初识自定义呈现器
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 在各个平台项目中定位呈现器的示例:
呈现器和属性
下一组呈现器实现了椭圆绘图,它们位于 Xamarin.FormsBook.Platform 解决方案的不同项目中。
EllipseView
类位于 Xamarin.FormsBook.Platform 平台中。 此类与 BoxView
类似,只定义了一个属性:Color
类型的 Color
。
呈现器可以通过重写呈现器中的 OnElementPropertyChanged
方法,将为 View
设置的属性值传输到本机对象。 在此方法中(并且在大多数呈现器中),可以使用两个属性:
Element
,Xamarin.Forms 元素Control
,本机视图、小组件或控件对象
这些属性的类型由 ViewRenderer
的泛型参数确定。 在本例中,Element
为 EllipseView
类型。
因此,OnElementPropertyChanged
重写可以通过某种转换将 Element
的 Color
值传输到本机 Control
对象。 三个呈现器如下所示:
- iOS:
EllipseViewRenderer
,它使用椭圆的EllipseUIView
类。 - Android:
EllipseViewRenderer
,它使用椭圆的EllipseDrawableView
类。 - UWP:
EllipseViewRenderer
,它可以使用本机 WindowsEllipse
类。
EllipseDemo 类将显示以下几个 EllipseView
对象:
BouncingBall 将 EllipseView
弹离屏幕边缘。
呈现器和事件
呈现器也可以间接生成事件。 StepSlider
类与正常的 Xamarin.FormsSlider
类似,但前者允许在 Minimum
和 Maximum
值之间指定多个不连续的阶段。
三个呈现器如下所示:
- iOS:
StepSliderRenderer
- Android:
StepSliderRenderer
- UWP:
StepSliderRenderer
呈现器检测对本机控件的更改,然后调用 SetValueFromRenderer
,这会引用在 StepSlider
中定义的可绑定属性,这种更改将导致 StepSlider
触发 ValueChanged
事件。
StepSliderDemo 示例展示了此新滑块。