共用方式為


第 27 章摘要。 自訂轉譯器

注意

這本書於2016年春季出版,此後一直沒有更新。 這本書中有很多仍然有價值,但一些材料已經過時,有些主題不再完全正確或完整。

Xamarin.Forms之類的 Button 專案會以封裝在名為ButtonRenderer的類別中封裝的平臺特定按鈕來轉譯。 以下是ButtonRenderer iOS 版本、Android 版本的ButtonRendererButtonRendererUWP 版本。

本章討論如何撰寫自己的轉譯器,以建立對應至平臺特定物件的自定義檢視。

完整的類別階層

有四個元件包含 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

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 :

Hello View 的三重螢幕快照

轉譯器和屬性

下一組轉譯器會實作省略號繪圖,並位於 Book.Platform 解決方案的各種專案中Xamarin.Forms

類別 EllipseView 位於 Xamarin.FormsBook.Platform 平臺 中。 類別類似於 BoxView ,而且只會定義 類型的單一屬性: Color Color

轉譯器可以覆OnElementPropertyChanged寫轉譯器中的 方法,將 上View設定的屬性值傳送至原生物件。 在此方法中(以及大部分轉譯器內),有兩個屬性可供使用:

  • Element,專案Xamarin.Forms
  • Control、原生檢視或小工具或控件物件

這些屬性的類型取決於的泛型參數。ViewRenderer 在這裡範例中, Element 的類型為 EllipseView

因此,覆OnElementPropertyChanged寫可以將 的值Element傳送Color至原生Control物件,可能具有某種轉換。 三個轉譯器為:

EllipseDemo 類別會顯示下列EllipseView數個物件:

Ellipse Demo 的三個螢幕快照

彈跳球從螢幕兩側彈跳EllipseView

轉譯器和事件

轉譯器也可以間接產生事件。 類別StepSlider類似於一般Xamarin.FormsSlider,但允許在 和 Maximum 值之間Minimum指定一些離散步驟。

三個轉譯器為:

轉譯器會偵測原生控件的變更,然後呼叫 SetValueFromRenderer,其會參考 中StepSlider定義的可系結屬性,而變更會導致 引發StepSliderValueChanged事件。

StepSliderDemo 範例示範這個新的滑桿。