摘要:第 12 章. 样式
注意
本书于 2016 年春季出版,之后再未更新。 书中有许多内容仍然有价值,但有些内容已过时,有些主题不再完全正确或完整。
在 Xamarin.Forms 中,通过使用样式,多个视图可共享属性设置的集合。 这样可以减少标记,并能够保持一致的视觉主题。
样式几乎总在标记中定义和使用。 在资源字典中实例化类型为 Style
的对象,然后使用 StaticResource
或 DynamicResource
标记扩展设置为可视元素的 Style
属性。
基本样式
Style
要求将其 TargetType
设置为其所应用的视觉对象的类型。 在资源字典中实例化 Style
时(很常见),它还需要一个 x:Key
属性。
Style
具有类型为 Setters
的内容属性,该属性是 Setter
对象的集合。 每个 Setter
将 Property
与 Value
关联。
在 XAML 中,Property
设置是 CLR 属性的名称(例如 Button
的 Text
属性),但是带样式的属性必须由可绑定属性提供支持。 同样,该属性必须在 TargetType
设置指示的类中定义,或者由该类继承。
可以使用属性元素 <Setter.Value>
指定 Value
设置。 这样,用户可以将 Value
设置为无法以文本字符串中表示的对象,或设置为 OnPlatform
对象或设置为使用 x:Arguments
或 x:FactoryMethod
实例化的对象。 也可以使用 StaticResource
表达式将 Value
属性设置为字典中的其他项。
BasicStyle 程序演示了基本语法,并显示了如何使用 StaticResource
标记扩展来引用 Style
:
Style
对象和任何在 Style
对象中作为 Value
设置创建的对象在引用该 Style
的所有视图之间共享。 Style
不能包含任何无法共享的内容,例如 View
导数。
无法在 Style
中设置事件处理程序。 无法在 Style
中设置 GestureRecognizers
属性,因为它不受可绑定属性支持。
代码中的样式
尽管不常见,但你可以在代码中实例化和初始化 Style
对象。 BasicStyleCode 示例对此进行了演示。
样式继承
Style
具有 BasedOn
属性,可以将其设置为引用其他样式的 StaticResource
标记扩展。 这样,允许从以前的样式继承样式,并添加或替换属性设置。 StyleInheritance 示例对此进行了演示。
如果 Style2
基于 Style1
,则 Style2
的 TargetType
必须与 Style1
相同或派生自 Style1
。 存储 Style1
的资源字典必须与 Style2
是相同的资源字典,或者是可视化树中更高的资源字典。
隐式样式
如果资源字典中的 Style
没有 x:Key
属性设置,则会自动为其分配字典键,并且 Style
对象将成为隐式样式。 如果视图没有 Style
设置且其类型与 TargetType
完全匹配,则该视图适用于该样式,如 ImplicitStyle 示例所示。
隐式样式可以从具有 x:Key
设置的 Style
派生,但不能反向派生。 不能显式引用隐式样式。
可以使用样式和 BasedOn
实现三种类型的层次结构:
- 从在
Application
和Page
上定义的样式到在可视化树中较低布局上定义的样式。 - 从为
VisualElement
和View
等基类定义的样式到为特定类定义的样式。 - 从具有显式词典键的样式到隐式样式。
这些层次结构在 StyleHierarchy 示例中进行了演示。
动态样式
资源字典中的样式可以由 DynamicResource
而不是 StaticResource
引用。 这会使样式成为动态样式。 如果该样式在资源字典中被另一个具有相同键的样式替换,则使用 DynamicResource
引用该样式的视图将自动更改。 此外,缺少具有指定键的字典项将导致 StaticResource
引发异常,但不会引发 DynamicResource
。
可以使用此方法动态更改样式或主题,如 DynamicStyles 示例所示。
但是,不能将 BasedOn
属性设置为 DynamicResource
标记扩展,因为 BasedOn
不受可绑定属性支持。 若要动态派生样式,请不要设置 BasedOn
。 而改为将 BaseResourceKey
属性设置为要派生样式的字典键。 DynamicStylesInheritance 示例对此方法进行了演示。
设备样式
Device.Styles
嵌套类使用 Label
的 TargetType
为六个样式定义了十二个静态只读字段,可用于常见类型的文本用法。
其中六个字段的类型为 Style
,可以在代码中直接将其设置为 Style
属性:
其他六个字段的类型为 string
,可用作动态样式的字典键:
BodyStyleKey
等于“BodyStyle”TitleStyleKey
等于“TitleStyle”SubtitleStyleKey
等于“SubtitleStyle”CaptionStyleKey
等于“CaptionStyle”ListItemTextStyleKey
等于“ListItemTextStyle”ListItemDetailTextStyleKey
等于“ListItemDetailTextStyle”
DeviceStylesList 示例对这些样式进行了演示。