代码中的资源 (WPF .NET)
本概述主要介绍如何使用代码(而非 XAML 语法)来访问或创建 Windows Presentation Foundation (WPF) 资源。 若要从 XAML 语法角度来详细了解常规资源用法以及资源,请参阅 XAML 资源概述。
从代码访问资源
如果在代码中请求资源,标识 XAML 定义的资源的键也用于检索特定的资源。 从代码检索资源最简单的方法是从应用程序中的框架级对象调用 FindResource 或 TryFindResource 方法。 这两个方法之间的行为差异在于未找到所请求的键时所发生的情况。 FindResource 会引发异常。 TryFindResource 不会引发异常,但会返回 null
。 每个方法都将资源键作为一个输入参数,并返回一个松散类型化对象。
通常,资源键是一个字符串,但也有偶尔的非字符串用法。 代码资源解析的查找逻辑与动态资源引用 XAML 的情况相同。 对资源的搜索从调用元素开始,然后继续通过逻辑树中的父元素进行搜索。 如果必要,将继续查找应用程序资源、主题以及系统资源。 针对资源的代码请求将正确考虑这些资源在运行时期间发生的更改。
下面的代码示例展示了一个 Click 事件处理程序,它按键来查找资源并使用返回的值来设置属性。
private void myButton_Click(object sender, RoutedEventArgs e)
{
Button button = (Button)sender;
button.Background = (Brush)this.FindResource("RainbowBrush");
}
Private Sub myButton_Click(sender As Object, e As RoutedEventArgs)
Dim buttonControl = DirectCast(sender, Button)
buttonControl.Background = DirectCast(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 标记扩展。
有关详细信息,请参阅样式、DataTemplate 和隐式键。