合并的资源字典

Windows Presentation Foundation (WPF) 资源支持合并的资源字典功能。 此功能提供了一种方法,用于在已编译的 XAML 应用程序之外定义 WPF 应用程序的资源部分。 然后,资源可以跨应用程序共享,并且更方便地隔离进行本地化。

创建合并字典

在标记中,使用以下语法将合并的资源字典引入页面:

<Page.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary Source="myresourcedictionary.xaml"/>
      <ResourceDictionary Source="myresourcedictionary2.xaml"/>
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</Page.Resources>

ResourceDictionary 元素没有 x:Key 指令,而在资源集合中,一般所有项都需要有该指令。 但是,对于合并资源字典的情况,集合中< c1 />内的另一个< c0 />引用是一种特殊情况,专门用于此情形。 此外,ResourceDictionary 引入的合并资源字典不能具有 x:Key 指示

通常, ResourceDictionary 集合中的每个 MergedDictionaries 成员都指定一个 Source 属性。 该值 Source 应为一个统一的资源标识符(URI),该标识符解析为要合并的资源文件的位置。 该 URI 的目标必须是另一个 XAML 文件,并 ResourceDictionary 作为其根元素。

注释

定义ResourceDictionary中的资源为合并字典是合法的,这可以作为指定Source的替代方案,也可以在指定源中包含的资源之外进行定义。 但是,这不是一个常见的方案。 合并字典的主要方案是从外部文件位置合并资源。 如果要在页面的标记中指定资源,请在主 ResourceDictionary 字典中定义这些资源,而不是在合并的字典中定义这些资源。

字典合并的行为

在合并字典中的资源占据的位置位于资源查找范围中,稍次于它们被合并进的主资源字典的范围。 尽管资源键在任何单个字典中必须是唯一的,但一组合并字典中可以多次存在一个键。 在这种情况下,返回的资源将来自集合中 MergedDictionaries 按顺序找到的最后一个字典。 MergedDictionaries如果集合是在 XAML 中定义的,则集合中合并字典的顺序是标记中提供的元素的顺序。 如果在主字典中以及合并的字典中定义了键,则返回的资源将来自主字典。 这些范围规则同样适用于静态资源引用和动态资源引用。

合并的字典和代码

可以通过代码将合并的字典添加到 Resources 字典中。 对于任何Resources属性,默认的最初为空ResourceDictionary也具有默认的最初为空MergedDictionaries集合属性。 若要通过代码添加合并字典,请获取对所需主对象的ResourceDictionary引用,获取其MergedDictionaries属性值,并调用Add包含在MergedDictionaries其中的泛型Collection。 您添加的对象必须是一个新 ResourceDictionary对象。

在代码中,不设置 Source 属性。 相反,必须通过创建一个对象或加载一个 ResourceDictionary 对象来获取对象。 加载现有 ResourceDictionary 对象以调用 XamlReader.Load 具有根的现有 XAML 文件流的方法之一 ResourceDictionary ,然后将返回值 ResourceDictionary强制转换为 。

合并字典 URI

有多种方法可用于包含合并资源字典,这由您使用的统一资源标识符(URI)格式指示。 从广义上讲,这些技术可以分为两类:作为项目的一部分编译的资源,以及未作为项目的一部分编译的资源。

对于作为项目之一部分编译的资源,可以使用指向资源位置的相对路径。 在编译期间计算相对路径。 必须将资源定义为项目的一部分,并作为 资源 生成操作。 如果将资源 .xaml 文件作为 资源包含在项目中,则无需将资源文件复制到输出目录,则资源已包含在编译的应用程序中。 还可以使用 内容 生成作,但随后必须将文件复制到输出目录,并将资源文件部署在与可执行文件相同的路径关系中。

注释

请勿使用 嵌入式资源 生成作。 WPF 应用程序支持生成操作本身,但解析 Source 不能合并 ResourceManager,因此无法将单个资源从流中分离出来。 只要你使用ResourceManager访问资源,你仍然可以将嵌入式资源用于其他目的。

相关技术是使用 XAML 文件的包 URI ,并将其称为 包 URI 允许引用被引用程序集的组件以及其他技术。 有关 包 URI 的详细信息,请参阅 WPF 应用程序资源、内容和数据文件

对于未作为项目的一部分编译的资源,将在运行时评估 URI。 可以使用常见的 URI 传输(如 文件:http: )来引用资源文件。 使用非编译资源方法的缺点是 文件: 访问需要额外的部署步骤,而 http: 访问意味着进入Internet安全区域。

重用合并的字典

可以在应用程序之间重复使用或共享合并的资源字典,因为可以通过任何有效的统一资源标识符(URI)引用要合并的资源字典。 具体作方式取决于应用程序部署策略以及遵循的应用程序模型。 前面提到的包 URI 策略提供了一种在开发过程中通过共享程序集引用在多个项目之间共享合并资源的方法。 在此方案中,资源仍由客户端分发,并且至少有一个应用程序必须部署引用的程序集。 还可以通过使用 http: 协议的分布式 URI 引用合并的资源。

将合并字典作为本地应用程序文件或本地共享存储写入是另一种可能的合并字典和应用程序部署方案。

本地化

如果需要本地化的资源被隔离到合并入主字典的子字典中,并且保持为未编译的 XAML 格式,则这些文件可以单独本地化。 此技术是对卫星资源程序集进行本地化的轻量化替代方案。 有关详细信息,请参阅 WPF 全球化和本地化概述

另请参阅