摘要:第 12 章. 样式

注意

本书于 2016 年春季出版,之后再未更新。 书中有许多内容仍然有价值,但有些内容已过时,有些主题不再完全正确或完整。

在 Xamarin.Forms 中,通过使用样式,多个视图可共享属性设置的集合。 这样可以减少标记,并能够保持一致的视觉主题。

样式几乎总在标记中定义和使用。 在资源字典中实例化类型为 Style 的对象,然后使用 StaticResourceDynamicResource 标记扩展设置为可视元素的 Style 属性。

基本样式

Style 要求将其 TargetType 设置为其所应用的视觉对象的类型。 在资源字典中实例化 Style 时(很常见),它还需要一个 x:Key 属性。

Style 具有类型为 Setters 的内容属性,该属性是 Setter 对象的集合。 每个 SetterPropertyValue 关联。

在 XAML 中,Property 设置是 CLR 属性的名称(例如 ButtonText 属性),但是带样式的属性必须由可绑定属性提供支持。 同样,该属性必须在 TargetType 设置指示的类中定义,或者由该类继承。

可以使用属性元素 <Setter.Value> 指定 Value 设置。 这样,用户可以将 Value 设置为无法以文本字符串中表示的对象,或设置为 OnPlatform 对象或设置为使用 x:Argumentsx:FactoryMethod 实例化的对象。 也可以使用 StaticResource 表达式将 Value 属性设置为字典中的其他项。

BasicStyle 程序演示了基本语法,并显示了如何使用 StaticResource 标记扩展来引用 Style

基本样式的三倍屏幕截图

Style 对象和任何在 Style 对象中作为 Value 设置创建的对象在引用该 Style 的所有视图之间共享。 Style 不能包含任何无法共享的内容,例如 View 导数。

无法在 Style 中设置事件处理程序。 无法在 Style 中设置 GestureRecognizers 属性,因为它不受可绑定属性支持。

代码中的样式

尽管不常见,但你可以在代码中实例化和初始化 Style 对象。 BasicStyleCode 示例对此进行了演示。

样式继承

Style 具有 BasedOn 属性,可以将其设置为引用其他样式的 StaticResource 标记扩展。 这样,允许从以前的样式继承样式,并添加或替换属性设置。 StyleInheritance 示例对此进行了演示。

如果 Style2 基于 Style1,则 Style2TargetType 必须与 Style1 相同或派生自 Style1。 存储 Style1 的资源字典必须与 Style2 是相同的资源字典,或者是可视化树中更高的资源字典。

隐式样式

如果资源字典中的 Style 没有 x:Key 属性设置,则会自动为其分配字典键,并且 Style 对象将成为隐式样式。 如果视图没有 Style 设置且其类型与 TargetType 完全匹配,则该视图适用于该样式,如 ImplicitStyle 示例所示。

隐式样式可以从具有 x:Key 设置的 Style 派生,但不能反向派生。 不能显式引用隐式样式。

可以使用样式和 BasedOn 实现三种类型的层次结构:

  • 从在 ApplicationPage 上定义的样式到在可视化树中较低布局上定义的样式。
  • 从为 VisualElementView 等基类定义的样式到为特定类定义的样式。
  • 从具有显式词典键的样式到隐式样式。

这些层次结构在 StyleHierarchy 示例中进行了演示。

动态样式

资源字典中的样式可以由 DynamicResource 而不是 StaticResource 引用。 这会使样式成为动态样式。 如果该样式在资源字典中被另一个具有相同键的样式替换,则使用 DynamicResource 引用该样式的视图将自动更改。 此外,缺少具有指定键的字典项将导致 StaticResource 引发异常,但不会引发 DynamicResource

可以使用此方法动态更改样式或主题,如 DynamicStyles 示例所示。

但是,不能将 BasedOn 属性设置为 DynamicResource 标记扩展,因为 BasedOn 不受可绑定属性支持。 若要动态派生样式,请不要设置 BasedOn。 而改为将 BaseResourceKey 属性设置为要派生样式的字典键。 DynamicStylesInheritance 示例对此方法进行了演示。

设备样式

Device.Styles 嵌套类使用 LabelTargetType 为六个样式定义了十二个静态只读字段,可用于常见类型的文本用法。

其中六个字段的类型为 Style,可以在代码中直接将其设置为 Style 属性:

其他六个字段的类型为 string,可用作动态样式的字典键:

DeviceStylesList 示例对这些样式进行了演示。