第 10 章的摘要。 XAML 標記延伸
注意
這本書於2016年春季出版,此後一直沒有更新。 這本書中有很多仍然有價值,但一些材料已經過時,有些主題不再完全正確或完整。
一般而言,XAML 剖析器會根據基本 .NET 數據類型的標準轉換,或 TypeConverter
附加至屬性或其型 TypeConverterAttribute
別的衍生專案,將任何字串轉換成 屬性值。
但有時候,從不同的來源設定屬性,例如字典中的專案,或靜態屬性或字段的值,或從某種排序的計算中設定屬性會很方便。
這是 XAML 標記延伸的工作。 儘管名稱是 XAML 標記延伸,但不是 XML 的延伸模組。 XAML 一律是合法的 XML。
程式代碼基礎結構
XAML 標記延伸是實作 介面的 IMarkupExtension
類別。 這類類別通常會在其名稱結尾有一個字 Extension
,但通常會出現在 XAML 中,而沒有該後綴。
XAML 的所有實作都支援下列 XAML 標記延伸:
x:Static
支援者StaticExtension
x:Reference
支援者ReferenceExtension
x:Type
支援者TypeExtension
x:Null
支援者NullExtension
x:Array
支援者ArrayExtension
XAML 的許多實作都支援這四個 XAML 標記延伸,包括 Xamarin.Forms:
StaticResource
支援者StaticResourceExtension
DynamicResource
支援者DynamicResourceExtension
Binding
支援的BindingExtension
— 在第 16 章中 討論。數據系結TemplateBinding
支援 -TemplateBindingExtension
未涵蓋於書籍中
額外的 XAML 標記延伸包含在 與 RelativeLayout
的連線中Xamarin.Forms:
ConstraintExpression
— 書中未涵蓋
存取靜態成員
x:Static
使用 元素,將屬性設定為公用靜態屬性、欄位或列舉成員的值。 將 Member
屬性設定為靜態成員。 通常更容易指定 x:Static
和大括弧中的成員名稱。 屬性的名稱 Member
不需要包含,只是成員本身。 這個常見的語法會顯示在 SharedStatics 範例中。 靜態欄位本身定義於 類別中 AppConstants
。 這項技術可讓您建立透過程式使用的常數。
使用額外的 XML 命名空間宣告,您可以參考 .NET Framework 中定義的公用靜態屬性、欄位或列舉成員,如 SystemStatics 範例所示。
資源字典
類別 VisualElement
會定義名為 Resources
的屬性,您可以設定為 型 ResourceDictionary
別 的物件。 在 XAML 中,您可以將專案儲存在此字典中,並使用 屬性加以識別 x:Key
。 儲存在資源字典中的專案會在專案的所有參考之間共用。
StaticResource 適用於大部分用途
在大部分情況下,您將使用StaticResource
標記延伸來參考資源字典中的專案,如 ResourceSharing 範例所示。 您可以使用 StaticResourceExtension
元素或在 StaticResource
大括弧內:
請勿混淆 x:Static
標記延伸和 StaticResource
標記延伸。
字典樹狀結構
當 XAML 剖析器遇到 StaticResource
時,它會開始搜尋可視化樹狀結構中的相符索引鍵,然後在應用程式的 App
類別中ResourceDictionary
尋找 。 這可讓可視化樹狀結構中更深入的資源字典中的專案覆寫可視化樹狀結構中較高的資源字典。 這會在 ResourceTrees 範例中示範。
適用於特殊用途的 DynamicResource
標記 StaticResource
延伸會在呼叫期間 InitializeComponent
建置可視化樹狀結構時,從字典擷取專案。 替代方法是 StaticResource
DynamicResource
,它會維護字典索引鍵的連結,並在索引鍵所參考的項目變更時更新目標。
和之間的差異StaticResource
會在 DynamicVsStatic 範例中DynamicResource
示範。
所DynamicResource
設定的屬性必須受到可系結屬性的支援,如第 11 章可系結基礎結構中所述。
較少使用的標記延伸
x:Null
使用標記延伸會設定為 null
。
x:Type
使用標記延伸將屬性設定為 .NET Type
物件。
使用 x:Array
來定義陣列。 將 [Type
] 屬性設定為 x:Type
標記延伸,以指定數位成員的類型。
自定義標記延伸
您可以撰寫使用 方法實作 介面ProvideValue
的IMarkupExtension
類別,以建立自己的 XAML 標記延伸。
類別 HslColorExtension
符合這些需求。 它會根據名為 H
、、 S
L
和 A
的屬性值,建立 型Color
別的值。 這個類別是名為Xamarin.Forms Book.Toolkit 的連結庫中的第一Xamarin.Forms個專案,該連結庫是在本書過程中建置和使用的專案。
CustomExtensionDemo 範例示範如何參考此連結庫並使用自定義標記延伸。