Share via


效果簡介

效果可讓您自訂每個平台上的原生控制項,通常用於小型的樣式變更。 本文提供效果簡介、概述效果與自訂轉譯器之間的界限,並描述 PlatformEffect 類別。

Xamarin.Forms頁面、版面配置和控制項 提供一般 API 來描述跨平臺行動使用者介面。 每個頁面、版面配置和控件會以不同的方式在每個平臺上轉譯,而 Renderer 這個類別接著會建立原生控件(對應至 Xamarin.Forms 表示法)、在畫面上排列它,並在共用程序代碼中新增指定的行為。

開發人員可以實作自己的自訂 Renderer 類別,以自訂控制項的外觀及/或行為。 不過,實作自訂轉譯器類別來執行簡單的控制項自訂通常是繁重的回應方式。 效果可簡化此程序,讓您更輕鬆地在每個平台上自訂原生控制項。

效果是透過子類別 PlatformEffect 化控件在平臺特定專案中建立,然後透過將效果附加至 .NET Standard 連結庫或共用連結庫專案中的適當控件 Xamarin.Forms 來取用效果。

為何優先選擇效果而不是自訂轉譯器?

效果可簡化控制項的自訂、可重複使用,而且可參數化以近一步提高重複使用率。

任何可透過效果完成的工作,也能透過自訂轉譯器完成。 不過,自訂轉譯器所提供的彈性和自訂都遠高於效果。 下列指導方針列出優先選擇效果而不是自訂轉譯器的情況:

  • 變更平台特定控制項的屬性會達成所要的結果時,建議使用效果。
  • 需要覆寫平台特定控制項的方法時,需要自訂轉譯器。
  • 當需要取代實作 控件的平臺特定控件 Xamarin.Forms 時,需要自定義轉譯器。

將 PlatformEffect 類別子類別化

下表列出每個平台上 PlatformEffect 類別的命名空間,以及其屬性的類型:

平台 Namespace 容器 控制
iOS Xamarin.Forms.Platform.iOS UIView UIView
Android Xamarin.Forms.Platform.Android ViewGroup 檢視
通用 Windows 平台 (UWP) Xamarin.Forms.Platform.UWP FrameworkElement FrameworkElement

每個平台特定的 PlatformEffect 類別會公開下列屬性:

  • Container – 參考正在用來實作配置的平台特定控制項。
  • Control – 參考用來實作 Xamarin.Forms 控件的平臺特定控制件。
  • Element – 參考 Xamarin.Forms 正在轉譯的控件。

效果不會有其所附加之容器、控制項或項目的相關類型資訊,因為它們可以附加至任何項目。 因此,當效果附加至不支援的項目時,它應該會正常降級或擲回例外狀況。 不過,ContainerControlElement 屬性可以轉換為其實作類型。 如需這些類型的詳細資訊,請參閱轉譯器基底類別和原生控制項

每個平台特定的 PlatformEffect 類別會公開下列方法,必須加以覆寫才能實作效果:

  • OnAttached – 當效果附加至 Xamarin.Forms 控件時呼叫。 在每一個平臺特定效果類別中,這個方法的覆寫版本是執行控件自定義的位置,如果無法將效果套用至指定的 Xamarin.Forms 控件,則例外狀況處理也一起。
  • OnDetached – 當效果與 Xamarin.Forms 控件中斷連結時呼叫。 在每個平台特定的效果類別中,此方法的覆寫版本是執行任何效果清除 (例如取消註冊事件處理常式) 的位置。

此外,PlatformEffect 會公開 OnElementPropertyChanged 方法,該方法也可能會遭到覆寫。 當項目的屬性變更時,就會呼叫此方法。 在每個平臺特定效果類別中,這個方法的覆寫版本是回應控件上 Xamarin.Forms 可系結屬性變更的位置。 因為此覆寫會呼叫多次,所以請一律檢查變更的屬性。