第 12 章的摘要。 Styles

注意

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

在 中 Xamarin.Forms,樣式允許多個檢視共用屬性設定的集合。 這樣可減少標記,並啟用維持一致的視覺主題。

樣式幾乎一律會在標記中定義和取用。 類型的 Style 物件會在資源字典中具現化,然後使用 或 DynamicResource 標記延伸設定為Style視覺項目的 StaticResource 屬性。

基本樣式

Style需要將其TargetType設定為所套用之視覺物件的型別。 Style在資源字典中具現化 時,也需要x:Key屬性。

Style具有 類型的 Setterscontent 屬性,這是 物件的集合Setter。 每個都會Setter將與產生Value關聯Property

在 XAML 中, Property 此設定是 CLR 屬性的名稱(例如 TextButton屬性),但樣式屬性必須受到可繫結屬性的支援。 此外,屬性必須在 設定所 TargetType 指示的類別中定義,或由該類別繼承。

您可以使用 屬性項目 <Setter.Value>來指定Value設定。 這可讓您將 設定 Value 為不能以文字字串表示的物件,或設定為 OnPlatform 物件,或是使用 x:Argumentsx:FactoryMethod具現化的物件。 屬性 Value 也可以使用表達式設定 StaticResource 為字典中的另一個專案。

BasicStyle 程式示範基本語法,並示範如何使用標記延伸來參考 StyleStaticResource

基本樣式的三重螢幕快照

對象Style和物件中StyleValue建立的任何物件都會在參考該 的所有檢視之間共用設定StyleStyle不能包含任何無法共用的任何專案,例如View衍生專案。

事件處理程式無法在 中 Style設定。 GestureRecognizers屬性無法設定在 中Style,因為它不是由可系結屬性所支援。

程序代碼中的樣式

雖然這並不常見,但您可以在程式代碼中具現化和初始化 Style 物件。 這是由 BasicStyleCode 範例所示範。

樣式繼承

StyleBasedOn具有屬性,您可以設定為參考另一個StaticResource樣式的標記延伸。 這可讓樣式繼承自先前的樣式,並新增或取代屬性設定。 StyleInheritance 範例會示範此範例。

如果 Style2 是以 為基礎Style1,則 TargetTypeStyle2 必須與 或 衍生自 Style1相同Style1。 儲存所在的 Style1 資源字典必須與 可視化樹狀結構中的資源字典 Style2 相同,或資源字典較高。

隱含樣式

Style如果資源字典中的 沒有x:Key屬性設定,它會自動指派字典索引鍵,而且Style物件會變成隱含樣式。 沒有 Style 設定的檢視,且其類型完全符合 TargetType 該樣式,如 ImplicitStyle 範例所示。

隱含樣式可以衍生自 Style 具有設定的 x:Key ,但不是另一種方式。 您無法明確參考隱含樣式。

您可以使用 樣式和 BasedOn來實作三種類型的階層:

  • 從上 Application 定義的樣式到 Page 可視化樹狀結構中較低版面配置上定義的樣式。
  • 從針對基類定義的樣式,例如 VisualElementView ,到針對特定類別定義的樣式。
  • 從具有明確字典索引鍵的樣式到隱含樣式。

這些階層會在 StyleHierarchy 範例中示範。

動態樣式

可以參考 DynamicResource 資源字典中的樣式,而不是 StaticResource。 這使得樣式成為 動態樣式。 如果該樣式在資源字典中由另一個樣式取代為相同的索引鍵,則參考該樣式的檢視會自動 DynamicResource 變更。 此外,沒有具有指定索引鍵的字典專案會導致引發例外狀況,但不會DynamicResource引發 StaticResource

您可以使用這項技術,以動態方式變更樣式或主題,如 DynamicStyles 範例所示。

不過,您無法將 BasedOn 屬性設定為 DynamicResource 化妝延伸模組,因為 BasedOn 不是因為不是由可系結的屬性所支援。 若要動態衍生樣式,請勿設定 BasedOn。 相反地,將 BaseResourceKey 屬性設定為您想要衍生自之樣式的字典索引鍵。 DynamicStylesInheritance 範例示範這項技術。

裝置樣式

Device.Styles狀類別會針對六個樣式定義 12 個靜態只讀欄位,其中TargetTypeLabel您可以用於一般文字用法類型的 。

這些欄位中有六個類型 Style ,您可以直接在程式代碼中設定為 Style 屬性:

其他六個字段的類型為 string ,而且可作為動態樣式的字典索引鍵:

DeviceStylesList 範例會說明這些樣式。