第 27 章摘要。 自訂轉譯器
注意
這本書於2016年春季出版,此後一直沒有更新。 這本書中有很多仍然有價值,但一些材料已經過時,有些主題不再完全正確或完整。
Xamarin.Forms之類的 Button
專案會以封裝在名為ButtonRenderer
的類別中封裝的平臺特定按鈕來轉譯。 以下是的ButtonRenderer
iOS 版本、Android 版本的ButtonRenderer
和 的 ButtonRenderer
UWP 版本。
本章討論如何撰寫自己的轉譯器,以建立對應至平臺特定物件的自定義檢視。
完整的類別階層
有四個元件包含 Xamarin.Forms 平臺特定的程序代碼。 您可以使用下列連結,在 GitHub 上檢視來源:
- Xamarin.Forms.平臺 (非常小)
- 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
。
HelloViewRenderer
HelloRenderers.iOS 專案中的 類別衍生自 ViewRenderer<HelloView, UILabel>
。 在 覆寫中 OnElementChanged
,它會建立原生 iOS UILabel
並呼叫 SetNativeControl
。
HelloViewRenderer
HelloRenderers.Droid 專案中的 類別衍生自 ViewRenderer<HelloView, TextView>
。 在 覆寫中 OnElementChanged
,它會建立 Android TextView
並呼叫 SetNativeControl
。
HelloViewRenderer
HelloRenderers.UWP 和其他 Windows 專案中的 類別衍生自 ViewRenderer<HelloView, TextBlock>
。 在 覆寫中 OnElementChanged
,它會建立 Windows TextBlock
並呼叫 SetNativeControl
。
ViewRenderer
所有衍生專案都包含ExportRenderer
元件層級上的屬性,可將HelloView
類別與特定HelloViewRenderer
類別產生關聯。 這就是在個別平台項目中尋找轉譯器的方式 Xamarin.Forms :
轉譯器和屬性
下一組轉譯器會實作省略號繪圖,並位於 Book.Platform 解決方案的各種專案中。Xamarin.Forms
類別 EllipseView
位於 Xamarin.FormsBook.Platform 平臺 中。 類別類似於 BoxView
,而且只會定義 類型的單一屬性: Color
Color
。
轉譯器可以覆OnElementPropertyChanged
寫轉譯器中的 方法,將 上View
設定的屬性值傳送至原生物件。 在此方法中(以及大部分轉譯器內),有兩個屬性可供使用:
Element
,專案Xamarin.FormsControl
、原生檢視或小工具或控件物件
這些屬性的類型取決於的泛型參數。ViewRenderer
在這裡範例中, Element
的類型為 EllipseView
。
因此,覆OnElementPropertyChanged
寫可以將 的值Element
傳送Color
至原生Control
物件,可能具有某種轉換。 三個轉譯器為:
- iOS:
EllipseViewRenderer
,它會使用橢圓EllipseUIView
形的類別。 - Android:
EllipseViewRenderer
,其使用EllipseDrawableView
橢圓形的類別。 - UWP:
EllipseViewRenderer
,可使用原生 WindowsEllipse
類別。
EllipseDemo 類別會顯示下列EllipseView
數個物件:
彈跳球從螢幕兩側彈跳EllipseView
。
轉譯器和事件
轉譯器也可以間接產生事件。 類別StepSlider
類似於一般Xamarin.FormsSlider
,但允許在 和 Maximum
值之間Minimum
指定一些離散步驟。
三個轉譯器為:
- iOS:
StepSliderRenderer
- Android:
StepSliderRenderer
- UWP:
StepSliderRenderer
轉譯器會偵測原生控件的變更,然後呼叫 SetValueFromRenderer
,其會參考 中StepSlider
定義的可系結屬性,而變更會導致 引發StepSlider
ValueChanged
事件。
StepSliderDemo 範例示範這個新的滑桿。