永远不会发生变化,所以使用静态资源比较合理,如下所示:
A Customized Button
这个示例可以工作,并且它将字体细节移出了标记。但该示例也存在两个问题: ● (除了资源名称相似之外)没有明确指明这三个资源是相互关联的。 这使维护应用程序变 得复杂。如果希望设置更多的字体属性,或者决定为不同类型的元素维护不同的字体 设置,这一问题会变得更加严重。 ● 使用资源设置属性的标记非常繁琐。实际上,还没有原来不使用资源时简明(直接为元 素定义字体属性)。 可以通过定义一个将所有字体细节捆绑在一起的自定义类(如 FontSetting 类),来解决第一 个问题。然后可以创建 FontSetting 对象资源,并在属性中使用它的各种属性。然而,这仍然需 要使用繁琐的资源—— 并且还需要做一些额外的
工作。 样式对这一
问题提供了非常好的解决
方案。可以定义一个独立的包装所有希望设置的属性 的样式。如下所示:
289
WPF 编程宝典— 使用 C# 2008 和.
NET 3.5(第 2 版) —
上面的标记创建了一个独立的资源:一个 System.Windows.Style 对象。这个样式对象包含 了一个 Setter 集合,该集合具有三个 Setter 对象,每个 Setter 对象用于一个希望设置的属性。 每个 Set
ter 对象由两部分信息组成:希望进行设置的属性和希望为该属性应用的数值。和所有 的资源一样,样式对象有一个键名,当需要时可以从集合中提取它。对于该示例,键名是 BigFontButtonStyle(根据约定,用于样式的键名通常以“Style”结尾)。 每个 WPF 元素都可以使用一个样式(或者没有样式),样式通过元素的 Style 属性(该属性是 在 FrameworkElement 类中定义的)嵌入到元素中。例如,使用上面创建的样式配置一个按钮, 需要让按钮指向样式资源,如下所示:
A Customized Button
当然,也可以通过代码设置样式。需要做的全部工作就是使用熟悉的 FindResource( )方法, 从最近的资源集合中提取样式。下面的代码为一个名称为 cmd 的 Button 对象设置样式:
cmdButton.Style = (Style)cmd.FindResource("BigFontButtonStyle");
图 12-1 显示的窗口中的两个按钮使用了 BigFontButtonStyle 样式。
图 12-1
通过样式重用按钮设置
注意: 样式设置元素的初始外观,但是可以随意覆盖它们设置的这些特征。例如,如果应用了 BigFontButtonStyle 样式, 并且显式地设置了 FontSize 属性, 在按钮标签中的 FontSize 设置会覆 盖样式。理想情况下,不应当依赖这种行为—— 而是应当创建更多的样式,从而可以在样式级 别上设置尽可能多的细节。 这样在将来调整用户界面时可以有更大的灵活性, 使干扰降到最低。 样式系统增加了许多优点。不仅可以创建多组明显相关的属性设置,而且还可以使标记更 加流线型,从而使应用这些设置更加容易。最佳方式是,可以应用样式而不用关心设置了哪些 属性。在上一个示例中,字体设置被组织到一个名称为 BigFontButtonStyle 的样式中。如果以 后决定大字体按钮还需要更多的内边距和外边距空间,也可以为 Padding 属性和 Margin 属性添 加设置器。所有使用样式的按钮会自动采用新的样式设置。
290
第 12 章
样
式
Setters 集合是 Style 类中最重要的属性。但并不是唯一的属性,在 Style 类中一共有 5 个重 要的属性,在本章会介绍这些属性。表 12-1 列出了这些属性。
表 12-1 属 Setters Triggers 性 Style 类的属性 描 述
设置属性值以及自动关联事件处理程序的 Setter 对象或 EventSetter 对象的集合 继承自 TriggerBase 类并且能够自动改变样式设置的对象的集合。例如,当另外一个属性改变时, 或者当发生某个事件时,可以修改样式
Resources
希望用于样式的资源集合。例如,可能需要使用一个对象设置多个属性。这时,将对象作为资源 创建,然后再在 Setter 对象中使用资源效率会更高效(而不