第 10 章的摘要。 XAML 標記延伸

Download Sample 下載範例

注意

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

一般而言,XAML 剖析器會根據基本 .NET 數據類型的標準轉換,或 TypeConverter 附加至屬性或其型 TypeConverterAttribute別的衍生專案,將任何字串轉換成 屬性值。

但有時候,從不同的來源設定屬性,例如字典中的專案,或靜態屬性或字段的值,或從某種排序的計算中設定屬性會很方便。

這是 XAML 標記延伸的工作。 儘管名稱是 XAML 標記延伸,但不是 XML 的延伸模組。 XAML 一律是合法的 XML。

程式代碼基礎結構

XAML 標記延伸是實作 介面的 IMarkupExtension 類別。 這類類別通常會在其名稱結尾有一個字 Extension ,但通常會出現在 XAML 中,而沒有該後綴。

XAML 的所有實作都支援下列 XAML 標記延伸:

XAML 的許多實作都支援這四個 XAML 標記延伸,包括 Xamarin.Forms:

額外的 XAML 標記延伸包含在 與 RelativeLayout的連線中Xamarin.Forms:

存取靜態成員

x:Static使用 元素,將屬性設定為公用靜態屬性、欄位或列舉成員的值。 將 Member 屬性設定為靜態成員。 通常更容易指定 x:Static 和大括弧中的成員名稱。 屬性的名稱 Member 不需要包含,只是成員本身。 這個常見的語法會顯示在 SharedStatics 範例中 靜態欄位本身定義於 類別中 AppConstants 。 這項技術可讓您建立透過程式使用的常數。

使用額外的 XML 命名空間宣告,您可以參考 .NET Framework 中定義的公用靜態屬性、欄位或列舉成員,如 SystemStatics 範例所示

資源字典

類別 VisualElement 會定義名為 Resources 的屬性,您可以設定為 型 ResourceDictionary別 的物件。 在 XAML 中,您可以將專案儲存在此字典中,並使用 屬性加以識別 x:Key 。 儲存在資源字典中的專案會在專案的所有參考之間共用。

StaticResource 適用於大部分用途

在大部分情況下,您將使用StaticResource標記延伸來參考資源字典中的專案,如 ResourceSharing 範例所示。 您可以使用 StaticResourceExtension 元素或在 StaticResource 大括弧內:

Triple screenshot of resource sharing

請勿混淆 x:Static 標記延伸和 StaticResource 標記延伸。

字典樹狀結構

當 XAML 剖析器遇到 StaticResource時,它會開始搜尋可視化樹狀結構中的相符索引鍵,然後在應用程式的 App 類別中ResourceDictionary尋找 。 這可讓可視化樹狀結構中更深入的資源字典中的專案覆寫可視化樹狀結構中較高的資源字典。 這會在 ResourceTrees 範例中示範。

適用於特殊用途的 DynamicResource

標記 StaticResource 延伸會在呼叫期間 InitializeComponent 建置可視化樹狀結構時,從字典擷取專案。 替代方法是 StaticResourceDynamicResource,它會維護字典索引鍵的連結,並在索引鍵所參考的項目變更時更新目標。

和之間的差異StaticResource會在 DynamicVsStatic 範例中DynamicResource示範。

DynamicResource設定的屬性必須受到可系結屬性的支援,如第 11 章可系結基礎結構中所述

較少使用的標記延伸

x:Null使用標記延伸會設定為 null

x:Type使用標記延伸將屬性設定為 .NET Type 物件。

使用 x:Array 來定義陣列。 將 [Type] 屬性設定為 x:Type 標記延伸,以指定數位成員的類型。

自定義標記延伸

您可以撰寫使用 方法實作 介面ProvideValueIMarkupExtension類別,以建立自己的 XAML 標記延伸。

類別 HslColorExtension 符合這些需求。 它會根據名為 H、、 SLA的屬性值,建立 型Color別的值。 這個類別是名為Xamarin.Forms Book.Toolkit 的連結庫中的第一Xamarin.Forms個專案,該連結庫是在本書過程中建置和使用的專案。

CustomExtensionDemo 範例示範如何參考此連結庫並使用自定義標記延伸。