第 12 章的摘要。 樣式
注意
這本書於2016年春季出版,此後一直沒有更新。 這本書中有很多仍然有價值,但一些材料已經過時,有些主題不再完全正確或完整。
在 中 Xamarin.Forms,樣式允許多個檢視共用屬性設定的集合。 這樣可減少標記,並啟用維持一致的視覺主題。
樣式幾乎一律會在標記中定義和取用。 類型的 Style
物件會在資源字典中具現化,然後使用 或 DynamicResource
標記延伸設定為Style
視覺項目的 StaticResource
屬性。
基本樣式
Style
需要將其TargetType
設定為所套用之視覺物件的型別。 Style
在資源字典中具現化 時,也需要x:Key
屬性。
Style
具有 類型的 Setters
content 屬性,這是 物件的集合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
和物件中Style
Value
建立的任何物件都會在參考該 的所有檢視之間共用設定Style
。 Style
不能包含任何無法共用的任何專案,例如View
衍生專案。
事件處理程式無法在 中 Style
設定。 GestureRecognizers
屬性無法設定在 中Style
,因為它不是由可系結屬性所支援。
程序代碼中的樣式
雖然這並不常見,但您可以在程式代碼中具現化和初始化 Style
物件。 這是由 BasicStyleCode 範例所示範。
樣式繼承
Style
BasedOn
具有屬性,您可以設定為參考另一個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 個靜態只讀欄位,其中TargetType
Label
您可以用於一般文字用法類型的 。
這些欄位中有六個類型 Style
,您可以直接在程式代碼中設定為 Style
屬性:
其他六個字段的類型為 string
,而且可作為動態樣式的字典索引鍵:
BodyStyleKey
等於 “BodyStyle”TitleStyleKey
等於 “TitleStyle”SubtitleStyleKey
等於 “SubtitleStyle”CaptionStyleKey
等於 “CaptionStyle”ListItemTextStyleKey
等於 “ListItemTextStyle”ListItemDetailTextStyleKey
等於 “ListItemDetailTextStyle”
DeviceStylesList 範例會說明這些樣式。