WPF编程宝典使用C# 2008和NET 35(第2版)样式.txt∞-一人行,必会发情 二人行,必会激情 三人行,必有奸情 就不会被珍惜。真实的女孩不完美,完美的女孩不真实。得之坦然,失之淡然,顺其自然,争其必然。 隐于山林(
网学)贡献
第 12 章
样
式
在第 11 章学习了 WPF 资源系统,使用资源可以在一个地方定义对象而在整个标记中使用 它们。尽管可以使用资源存储各种对象,但是使用资源最常见的原因是通过它们保存样式。 样式是可以应用到元素的属性值的集合。WPF 样式系统和
HTML 标记中的层叠样式表 (cas
cading style sheet,CSS)标准扮演类似的角色。和 CSS 类似,通过 WPF 样式可以定义格式 化特性集合,并且为了保证一致性,在整个应用程序中应用它们。同 CSS 一样,WPF 样式也 可以自动工作,指定具体的元素类型,并且通过元素树层叠起来。然而,WPF 样式的功能更加 强大,因为它们能够设置任何依赖项属性。这意味着可以使用它们标准化未格式化的特性,如 控件的行为。WPF 样式还支持触发器,当一个属性发生变化时可以通过触发器改变控件的样式 (正如将要在本章中介绍的那样), 并且能够使用模板重新定义控件的内置外观(将在第 15 章中介 绍这些内容)。一旦学习了如何使用样式,就可以在所有的 WPF 应用程序中使用它们。
12.1
样式基础
在第 11 章中已
学习过, 资源具有几个重要的优点, 包括简化标记和使应用程序更容易维护。 那么样式有哪些优点呢? 为了理解适合使用样式的场合,分析一个简单的示例十分有帮助。设想需要标准化在窗口 中使用的字体。最简单的方法是设置包容器窗口的字体属性。这些属性是在 Control 类中定义 的,包括 FontFamily 属性、FontSize 属性、FontWeight 属性(用于粗体)、FontStyle 属性(用于斜 体)以及 FontStretch 属性(用于
压缩的或扩展的变体)。幸运的是,这些属性值具有继承特性,当 在窗口级别上设置这些属性时,在窗口中的所有元素都会使用相同的属性值,除非显式地覆盖 它们。 注意: 属性值继承是依赖项属性提供的许多可选的特性之一。在第 6 章已介绍了依赖项属性。 现在考虑一种不同的情况,希望只为用户界面中的一部分锁定字体。如果能够在一个特定 包容器中隔离这些元素(例如,它们都处于一个 Grid 面板或 StackPanel 面板中),可以使用本质 上相同的方法,并设置包容器的字体属性。但问题并不总是这么简单。例如,可能希望使所有 的按钮具有一致的字体和文本尺寸,并且使用和其他元素不同的字
体设置。对于这种情况,就 需要另外一种方法,在某个地方定义这些细节,并在所有应用它们的地方重用这些细节。 资源提供了一个解决方案,但是有些笨拙。因为在 WPF 中没有 Font 对象(只有与字体属性
第 12 章
样
式
相关的集合),所以需要定义几个相关的资源,如下所示:
Times New Roman 18 Bold 上面的标记为窗口添加了三个资源:第一个资源是 FontFamily 对象,该资源包含希望使用 的 字 体 名 称 ; 第 二 个 资 源 是 存 储 数 字 18 的 double 对 象 ; 第 三 个 资 源 是 一 个 枚 举 值 FontWeight.Bold。假定已经将.NET 名称空间
系统映射到 XAML 名称空间前缀,如下所示:
xmlns:sys="clr-namespace:System;assembly=mscorlib" …… >
提示: 当使用资源设置属性时,正确匹配属性类型是非常重要的。这时 WPF 使用类型转换器的 方式和直接设置一个特性值是不同的。例如,如果正在为元素设置 FontFamily 特性,可以使用 字符串“Times New Roman” ,因为 FontFamilyConverter 转换器会创建所需要的 FontFamily 对 象。但如果试图使用字符串资源设置 FontFamily 属性,情况就不同了—— 这时,XAML 解析器 会抛出一个异常。 一旦定义了所需要的资源,下一步是在元素中实际使用这些资源。因为在整个应用程序的 生命周期中,这些资源