合并资源字典
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 指令,该特性通常是资源集合中的所有项所必需的。 但是,MergedDictionaries 集合中的另一个 ResourceDictionary 引用是一个特例,它是为这个合并资源字典方案保留的。 引入了合并资源字典的 ResourceDictionary 不能具有 x:Key 指令。 通常,MergedDictionaries 集合中的每个 ResourceDictionary 都指定一个 Source 特性。 Source 的值应当是可解析为要合并的资源文件所在位置的uniform resource identifier (URI)。 该 URI 的目标必须是另一个 XAML 文件,并将 ResourceDictionary 作为其根元素。
注意 |
---|
允许在指定为合并字典的 ResourceDictionary 中定义资源,该资源可以作为指定 Source 的替代项,也可以作为指定源中包含的资源的补充。但是,这不是常见的方案,合并字典的主要方案是合并来自外部文件位置的资源。如果要在页面的标记内指定资源,则通常应当在主 ResourceDictionary(而不是合并字典)中定义这些资源。 |
合并字典的行为
合并字典中的资源在资源查找范围中占据一个位置,该位置紧随在这些资源所合并到的主资源字典的范围之后。 尽管资源键必须在任何字典中保持唯一,但是资源键可以在一组合并字典中出现多次。 在这种情况下,所返回的资源将来自在 MergedDictionaries 集合中最后一个找到的字典。 如果 MergedDictionaries 集合是在 XAML 中定义的,则集合中合并字典的顺序就是元素在标记中的提供顺序。 如果资源键在主字典以及合并字典中均进行了定义,则所返回的资源将来自主字典。 这些范围规则对于静态资源引用和动态资源引用同样适用。
合并字典和代码
合并字典可以通过代码添加到 Resources 字典中。 对于任何 Resources 属性存在的默认 ResourceDictionary(初始为空)还有一个默认的 MergedDictionaries 集合属性(初始为空)。 若要通过代码添加合并字典,可以获取对所需的主 ResourceDictionary 的引用,获取它的 MergedDictionaries 属性值,针对包含在 MergedDictionaries 中的泛型 Collection 调用 Add。 您添加的对象必须是新的 ResourceDictionary。 在代码中,不需要设置 Source 属性, 而必须通过创建或加载一个 ResourceDictionary 对象来获取该对象。 加载现有 ResourceDictionary 的一种方法是,针对具有 ResourceDictionary 根的现有 XAML 文件流调用 XamlReader.Load,然后将 XamlReader.Load 返回值强制转换为 ResourceDictionary。
合并资源字典 URI
可通过多种方法来包括合并资源字典,这些方法由将要使用的uniform resource identifier (URI) 格式来指示。概括地说,这些方法可以分为两类:作为项目一部分来编译的资源;不作为项目一部分来编译的资源。
对于作为项目一部分来编译的资源,可以使用引用资源位置的相对路径。 相对路径是在编译过程中计算的。 您的资源必须以“资源”生成操作形式定义为项目的一部分。 如果您将资源的 .xaml 文件以“资源”形式包括在项目中,则不必将资源文件复制到输出目录,因为资源已经包括在所编译的应用程序中。 您还可以使用“内容”生成操作,但是您必须将文件复制到输出目录,而且还必须将同一路径关系中的资源文件部署到可执行文件中。
注意 |
---|
不要使用“嵌入的资源”生成操作。该生成操作本身受 WPF 应用程序的支持,但是在解析 Source 时不会合并 ResourceManager,因此无法将单独的资源从流中分离出来。只要您在访问资源时使用的还是 ResourceManager,您就仍可以使用“嵌入的资源”来实现其他目的。 |
一个相关方法是使用 XAML 文件的 Pack URI 并称之为“源”。 Pack URI 允许引用所引用程序集和其他方法的组件。有关 Pack URI 的更多信息,请参见 WPF 应用程序资源、内容和数据文件。
对于不是作为项目一部分来编译的资源,URI 是在运行时计算的。 可以使用常见的 URI 传输机制(如 file: 或 http:)来引用资源文件。 使用非编译资源方法的缺点在于,file: 访问机制需要额外的部署步骤,而 http: 访问机制则直接使用 Internet 安全区域。
重用合并字典
可以在应用程序之间重用或共享合并资源字典,因为要合并的资源字典可以通过任何有效的uniform resource identifier (URI) 来引用。 您需要执行的确切操作将取决于应用程序的部署策略以及所遵循的应用程序模型。 使用前面提到的 Pack URI 策略,在开发中可以通过共享程序集引用来将合并资源在多个项目之间共用。 在此方案中,资源仍由客户端分发,而且至少有一个应用程序必须部署所引用的程序集。还可以通过一个使用 http 协议的分布式 URI 来引用合并资源。
将合并字典编写为本地应用程序文件或本地共享存储是另一种可能的合并字典/应用程序部署方案。
本地化
如果将需要本地化的资源隔离到已经与主字典合并的字典中,而且保持为松散 XAML,则可以单独对这些文件进行本地化。 此方法是本地化附属资源程序集的轻量替代方法。 有关详细信息,请参见 WPF 全球化和本地化概述。