代码中的资源

本概述侧重于如何使用代码而不是 XAML 语法访问或创建 Windows Presentation Foundation (WPF) 资源。 有关 XAML 语法角度的常规资源使用情况和资源的详细信息,请参阅 XAML 资源的概述

从代码访问资源

如果在代码中请求资源,标识 XAML 定义的资源的键也用于检索特定资源。 从代码检索资源的最简单方法是从应用程序中的框架级对象调用 FindResourceTryFindResource 方法。 这些方法之间的行为差异是找不到请求的密钥时会发生什么情况。 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 作为独立对象维护,而无需将其添加到元素。 但是,如果执行此操作,则必须按项键访问其中的资源,就好像它是泛型字典一样。 未附加到元素属性的 ResourceDictionary 不会作为元素树 Resources 的一部分存在,并且在查找序列中没有作用域,可用于 FindResource 和相关方法。

将对象用作键

大多数资源使用情况会将资源的键设置为字符串。 但是,各种 WPF 功能故意将对象类型用作键而不是字符串。 WPF 样式和主题支持使用通过对象类型对资源进行键控的功能。 作为其他方式非样式控件的默认值的样式和主题都由 Type 它们应应用于的控件进行键控。

按类型键入提供了一种可靠的查找机制,可用于每种控件类型的默认实例。 即使派生类型没有默认样式,也可以通过反射检测类型并用于设置派生类样式。 可以使用 Type为 XAML 中定义的资源指定 键。 支持 WPF 功能的其他非字符串键用法也存在类似的扩展,例如 ComponentResourceKey 标记扩展

有关详细信息,请参阅 样式、DataTemplates 和隐式键

另请参阅