注意
這本書於2016年春季出版,此後一直沒有更新。 這本書中有很多仍然有價值,但一些材料已經過時,有些主題不再完全正確或完整。
在 中 Xamarin.Forms,樣式允許多個檢視共用屬性設定的集合。 這樣可減少標記,並啟用維持一致的視覺主題。
樣式幾乎一律會在標記中定義和取用。 類型的 Style 物件會在資源字典中具現化,然後使用 或 DynamicResource 標記延伸設定為Style視覺項目的 StaticResource 屬性。
基本樣式
Style需要將其TargetType設定為所套用之視覺物件的型別。 Style在資源字典中具現化 時,也需要x:Key屬性。
Style具有 類型的 Setterscontent 屬性,這是 物件的集合Setter。 每個都會Setter將與產生Value關聯Property。
在 XAML 中, Property 此設定是 CLR 屬性的名稱(例如 Text 的 Button屬性),但樣式屬性必須受到可繫結屬性的支援。 此外,屬性必須在 設定所 TargetType 指示的類別中定義,或由該類別繼承。
您可以使用 屬性項目 <Setter.Value>來指定Value設定。 這可讓您將 設定 Value 為不能以文字字串表示的物件,或設定為 OnPlatform 物件,或是使用 x:Arguments 或 x:FactoryMethod具現化的物件。 屬性 Value 也可以使用表達式設定 StaticResource 為字典中的另一個專案。
BasicStyle 程式示範基本語法,並示範如何使用標記延伸來參考 Style StaticResource :
對象Style和物件中StyleValue建立的任何物件都會在參考該 的所有檢視之間共用設定Style。 Style不能包含任何無法共用的任何專案,例如View衍生專案。
事件處理程式無法在 中 Style設定。 GestureRecognizers屬性無法設定在 中Style,因為它不是由可系結屬性所支援。
程序代碼中的樣式
雖然這並不常見,但您可以在程式代碼中具現化和初始化 Style 物件。 這是由 BasicStyleCode 範例所示範。
樣式繼承
StyleBasedOn具有屬性,您可以設定為參考另一個StaticResource樣式的標記延伸。 這可讓樣式繼承自先前的樣式,並新增或取代屬性設定。 StyleInheritance 範例會示範此範例。
如果 Style2 是以 為基礎Style1,則 TargetType 的 Style2 必須與 或 衍生自 Style1相同Style1。 儲存所在的 Style1 資源字典必須與 可視化樹狀結構中的資源字典 Style2 相同,或資源字典較高。
隱含樣式
Style如果資源字典中的 沒有x:Key屬性設定,它會自動指派字典索引鍵,而且Style物件會變成隱含樣式。 沒有 Style 設定的檢視,且其類型完全符合 TargetType 該樣式,如 ImplicitStyle 範例所示。
隱含樣式可以衍生自 Style 具有設定的 x:Key ,但不是另一種方式。 您無法明確參考隱含樣式。
您可以使用 樣式和 BasedOn來實作三種類型的階層:
- 從上
Application定義的樣式到Page可視化樹狀結構中較低版面配置上定義的樣式。 - 從針對基類定義的樣式,例如
VisualElement和View,到針對特定類別定義的樣式。 - 從具有明確字典索引鍵的樣式到隱含樣式。
這些階層會在 StyleHierarchy 範例中示範。
動態樣式
可以參考 DynamicResource 資源字典中的樣式,而不是 StaticResource。 這使得樣式成為 動態樣式。 如果該樣式在資源字典中由另一個樣式取代為相同的索引鍵,則參考該樣式的檢視會自動 DynamicResource 變更。 此外,沒有具有指定索引鍵的字典專案會導致引發例外狀況,但不會DynamicResource引發 StaticResource 。
您可以使用這項技術,以動態方式變更樣式或主題,如 DynamicStyles 範例所示。
不過,您無法將 BasedOn 屬性設定為 DynamicResource 化妝延伸模組,因為 BasedOn 不是因為不是由可系結的屬性所支援。 若要動態衍生樣式,請勿設定 BasedOn。 相反地,將 BaseResourceKey 屬性設定為您想要衍生自之樣式的字典索引鍵。 DynamicStylesInheritance 範例示範這項技術。
裝置樣式
巢Device.Styles狀類別會針對六個樣式定義 12 個靜態只讀欄位,其中TargetTypeLabel您可以用於一般文字用法類型的 。
這些欄位中有六個類型 Style ,您可以直接在程式代碼中設定為 Style 屬性:
其他六個字段的類型為 string ,而且可作為動態樣式的字典索引鍵:
BodyStyleKey等於 “BodyStyle”TitleStyleKey等於 “TitleStyle”SubtitleStyleKey等於 “SubtitleStyle”CaptionStyleKey等於 “CaptionStyle”ListItemTextStyleKey等於 “ListItemTextStyle”ListItemDetailTextStyleKey等於 “ListItemDetailTextStyle”
DeviceStylesList 範例會說明這些樣式。
