注意
這本書於2016年春季出版,此後一直沒有更新。 這本書中有很多仍然有價值,但一些材料已經過時,有些主題不再完全正確或完整。
Xamarin.Forms之類的 Button 專案會以封裝在名為ButtonRenderer的類別中封裝的平臺特定按鈕來轉譯。 以下是的ButtonRenderer iOS 版本、Android 版本的ButtonRenderer 和 的 ButtonRendererUWP 版本。
本章討論如何撰寫自己的轉譯器,以建立對應至平臺特定物件的自定義檢視。
完整的類別階層
有四個元件包含 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.ViewTNativeView限制為UIKit.UIView
Android ViewRenderer<TView, TNativeView> 具有泛型自變數:
TView限制為Xamarin.Forms.ViewTNativeView限制為Android.Views.View
UWP ViewRenderer<TElement, TNativeElement> 有不同的名稱泛型自變數:
TElement限制為Xamarin.Forms.ViewTNativeElement限制為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定義的可系結屬性,而變更會導致 引發StepSliderValueChanged事件。
StepSliderDemo 範例示範這個新的滑桿。

