系统资源

 

前面已经学习过,动态资源主要用于辅助应用程序对系统环境设置的变化做出响应。但这会引发一个问题-- 首先,如何检索系统环境设置并在代码中使用它们呢?

这 要用到三个类,分别是SystemColors类、SystemFonts类和SystemParameters类,所有这些类都位于 System.Windows名称空间中。SystemColors类用于访问颜色设置;SystemFonts类用于访问字体设置;而 SystemParameters类包装了大量的设置列表,这些设置列表描述了各种屏幕元素的标准尺寸、键盘和鼠标设置、屏幕尺寸以及各种图形效果(如热 跟踪、阴影以及当拖动窗口时显示窗口内容)是否已经打开。

注意:

SystemColors类和SystemFonts类有两 个版本。它们分别位于System.Windows名称空间和System.Drawing名称空间。在System.Windows名称空间中的版本是 WPF的一部分。它们使用正确的数据类型并支持资源系统。位于System.Drawing名称空间中的版本是Windows窗体和.NET Framework 2.0的一部分。对于WPF应用程序,它们没有用处。

SystemColors、SystemFonts和 SystemParameters类通过静态属性提供了所有的细节。例如,SystemColors.WindowTextColor属性获取Color 结构,您可能会用到它。下面的示例,使用该属性创建一个画刷,并使用创建的画刷填充一个元素的前景色:

<imagebrush x:key=< span="">

  1. label.Foreground = new SolidBrush (SystemColors.WindowTextColor); 

或者为了更加高效,可以使用现成的画刷属性:

  1. label.Foreground = SystemColors.WindowTextBrush; 

在WPF中,可以使用静态标记扩展访问静态属性。例如,下面的标记演示了如何使用XAML为同一元素设置前景色:

  1. <Label Foreground='{x:Static SystemColors.WindowTextBrush}'>  
  2. Ordinary text  
  3. </Label> 

上 面的示例没有使用资源,可能会引发一个小问题-- 当解析窗口并且创建标签时,会根据当前窗口文本颜色的'快照'创建画刷。如果在应用程序运行时(在显示了窗口包含的标签之后),改变了Windows系统 颜色,Label控件就不会更新自身。具有这种行为的应用程序被认为是不太合理的。

为了解决这个问题,不能将Foreground属性直接 设置为画刷对象。而是需要将它设置为包装了该系统资源的DynamicResource对象。幸运的是,所有SystemXxx类都提供了一个返回 ResourceKey对象引用的补充属性集合,使用这些引用可以从系统资源集合中提取资源。这些属性的名称,是由直接返回对象的原始属性的名称,后跟单 词Key构成的。例如,SystemColors.WindowTextBrush的资源键是SystemColors.WindowText BrushKey。

注意:

资源键不仅仅是名称-- 它们是告诉WPF从哪儿查找特定资源的引用。ResourceKey类是不透明的,因此它不显示有关如何标识系统资源的低级细节。然而,不必担心您的资源会和系统资源会发生冲突,因为它们位于不同的程序集中并使用不同的方式进行处理。

下面的标记显示如何使用来自SystemXxx类的资源:

  1. <Label Foreground='{DynamicResource {x:Static SystemColors.Window TextBrushKey}}'>  
  2. Ordinary text  
  3. </Label> 

上 面的标记比前面的示例要复杂一些。首先定义了一个动态资源,但该动态资源没有从应用程序的资源集合中提取资源。而是使用了一个由 SystemColors.WindowTextBrushKey属性定义的键。因为该属性是静态属性,所以还需要使用一个标记扩展,从而让解析器理解正 在进行什么操作。

现在已经完成了修改,当系统设置变化时,Label控件能够立即更新它自身。

posted @ 2013-07-11 16:12  无晴雪  阅读(339)  评论(0编辑  收藏  举报