一、资源的层次
每个元素都有自己的资源集合,为了找到期望的资源,WPF在元素树中进行递归搜索。
在WPF编程宝典读书笔记——第10章 资源(一)中将资源定义在了窗口级别,也可以将资源定义在包含三个按钮的StackPanel面板中,此时不用更改任何代码同样可以实现资源(一)中的功能。当然也可以将资源定义在按钮资源中,但这样会重复定义4次。
二、动态资源和静态资源
(1)静态资源必须先定义后使用否则XAML解析器就会抛异常。
异常实例演示:将Window.Resources资源放在StaticPanel后面定义则会抛出异常。
异常代码实例源码下载:ResourcesTest002
(2)静态资源和动态资源的区别
静态资源:只从资源集合中获取对象一次
动态资源:在每次需要对象时都会重新从资源集合中查找对象,这意味着在同一个键名下放置个全新的对象,此时动态资源会 自动应该该变化。
实例演示:第一个按钮使用静态资源,第二个按钮使用动态资源,点击第三个按钮会用纯色画刷替换掉当前资源的的图像画刷 对象。
上图:初始显示
上图:替换后显示
实例源码下载:ResourcesTest003
三、通过代码访问资源
通常在标记中定义和使用资源,如有必要,也可在代码中使用资源集合。
注意用到两个方法FindResource()和TryFindResource(),其中使用TryFindResource()方法,如果找不到资源,该方法会返回null,而不会抛出异常。
四、应用程序资源
窗口不是查找资源的最后一站。如果在控件或其容器(包含窗体)中找不到指定的资源,WPF会继续检查为应用程序定义的资源集合。在VS中,这些资源定义在App.xaml中。
应用程序资源为整个应用程序重用对象提供了一种极佳的方法。如果计划在多个窗口中使用资源对象,将其定义为程序资源是最好的选择。
实例代码演示:
五、系统资源
系统资源主要牵扯到三个类,分别是:SystemColors、SystemFonts和SystemParameters,这三个类都位于System.Windows名称空间中。他们通过各自的静态属性公开他们的所有细节。
SystemColors类用于访问颜色设置。
SystemFonts类用于访问字体设置。
SystemParameters类封装了大量的设置列表,这些设置描述了各种屏幕元素的标准尺寸、键盘和鼠标设置、屏幕尺寸以及各种图形效果(如热跟踪、阴影以及拖动窗口时显示窗口内容)是否已经打开。
通过代码应用系统资源,示例如下:
btn3.Foreground = new SolidColorBrush(SystemColors.WindowTextColor);
或为了提高效率,可使用现成的画刷属性:
btn3.Foreground = SystemColors.WindowTextBrush;
在WPF中,可使用静态标记扩展访问静态属性,代码如下:
<Button Foreground="{x:Static SystemColors.WindowTextBrush}"/>
上面的代码没有使用资源,这样在系统对应的属性发生变化时,该按钮控件不会更新自身。
若要实现当系统设置变化是,控件能够无缝地自动更新自身,需添加动态资源,代码如下:
<Button Foreground="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"/>