资源和代码

本概述主要介绍如何使用代码而非 Extensible Application Markup Language (XAML) 语法来访问或创建 Windows Presentation Foundation (WPF) 资源。 若要详细了解常规资源用法以及 XAML 语法角度的资源,请参阅 XAML 资源

从代码访问资源

用于识别通过 XAML 定义的资源的键也用于检索特定资源(如果你在代码中请求此资源)。 从代码检索资源最简单的方法是从应用程序中的框架级对象调用 FindResourceTryFindResource 方法。 这两个方法之间的行为差异在于当未找到所请求的键时所发生的情况。 FindResource 引发异常;TryFindResource 不引发异常,而是返回 null。 每个方法都将资源键作为一个输入参数,并返回一个松散类型化对象。 资源键通常是字符串,但有时也用作非字符串;有关详细信息,请参阅将对象用作键部分。 通常应将返回的对象强制转换为请求资源时设置的属性所要求的类型。 代码资源解析的查找逻辑与动态资源引用 XAML 的情况相同。 对资源的搜索从调用元素开始,然后继续搜索逻辑树中的后续父元素。 如果必要,将继续查找应用程序资源、主题以及系统资源。 资源的代码请求将正确地说明资源字典(可能排在从 XAML 加载的资源字典之后)中的运行时更改,也将说明实时系统资源更改。

下面是一段简短的代码示例,该示例通过键查找资源并使用返回的值来设置属性,该示例是作为 Click 事件处理程序实现的。

void SetBGByResource(object sender, RoutedEventArgs e)
{
  Button b = sender as Button;
  b.Background = (Brush)this.FindResource("RainbowBrush");
}
Private Sub SetBGByResource(ByVal sender As Object, ByVal e As RoutedEventArgs)
  Dim b As Button = TryCast(sender, Button)
  b.Background = CType(Me.FindResource("RainbowBrush"), Brush)
End Sub

分配资源引用的另一种方法是 SetResourceReference。 该方法采用两个参数:资源的键,以及特定依赖属性(应向其分配资源值的元素实例上的依赖属性)的标识符。 就功能而言,此方法是相同的,且具有无需强制转换任何返回值的优点。

还有另一种以编程方式访问资源的方法,即:将 Resources 属性的内容作为字典来访问。 通过访问该属性包含的字典,还可以向现有集合添加新资源、检查集合中是否已经存在给定的键名称以及执行其他字典/集合操作。 如果完全通过代码方式编写 WPF 应用程序,则也可以通过代码创建整个集合,为其分配键,然后将完成的集合分配给已建立的元素的 Resources 属性。 这将在下一部分介绍。

可以在任何给定的 Resources 集合内编制索引(将特定键用作索引),但你应当知道以这种方式访问资源未遵循资源解析的常规运行时规则。 你访问的仅是该特定集合。 如果在请求的键处未找到有效的对象,则资源查找将不会遍历范围直至根或应用程序。 但是,在某些情况下,正因为对键的搜索范围进行了更多的约束,才使得此方法在性能上具有优势。 有关如何直接处理资源字典的更多详细信息,请参阅 ResourceDictionary 类。

使用代码创建资源

如果要通过代码方式创建整个 WPF 应用程序,可能也需要通过代码方式创建该应用程序中的任何资源。 为此,应先新建一个 ResourceDictionary 实例,接着使用对 ResourceDictionary.Add 的连续调用将所有资源添加到字典中。 然后使用创建的 ResourceDictionary 来设置位于页范围内的元素的 Resources 属性,或设置 Application.Resources 属性。 也可以将 ResourceDictionary 作为一个单独的对象来维护(而不将它添加到元素中)。 但是,如果这样做,必须通过项键来访问其中的资源,就好像它是泛型字典一样。 未附加到元素 Resources 属性的 ResourceDictionary 将不作为元素树的一部分存在,在查找序列中也不具有可供 FindResource 及相关方法使用的范围。

将对象用作键

大多数资源用法都会将资源的键设置为字符串。 但是,各个 WPF 功能都特意不使用字符串类型来指定键,而是将此参数设置为对象。 WPF 样式和主题支持使用按对象对资源进行键控的功能。 主题中成为非样式控件的默认样式的样式都将按它们应当应用于的控件的 Type 来进行键控。 按类型进行键控提供了一种可靠的查找机制,该机制作用于每个控件类型的默认实例,即使派生类型不具有默认样式,也可以通过反射检测到类型,并将类型用于设置派生类的样式。 可以使用 x:Type 标记扩展为 XAML 中定义的资源指定 Type 键。 对于支持 WPF 功能的其他非字符串键用法,也存在类似扩展,例如 ComponentResourceKey 标记扩展

另请参阅