使用 MRT Core 管理资源

MRT 核心是新式 Windows 资源管理系统的简化版本,作为 Windows 应用 SDK 的一部分分发。

MRT Core 具有生成时和运行时功能。 在生成时间,系统创建与你的应用打包在一起的资源的所有不同变体的索引。 此索引为包资源索引 (PRI),它也包括在你的应用包中。

先决条件

若要在 Windows 应用 SDK 中使用 Windows MRT 核心 API:

  1. 下载并安装 Windows 应用 SDK 的最新版本。 有关详细信息,请参阅 WinUI 入门。
  2. 按照说明创建你的第一个 WinUI 3 项目,或者在现有项目中使用 Windows App SDK

若要详细了解 MRT Core 在 Windows 应用 SDK 中的可用性,请参阅发布渠道

包资源索引 (PRI) 文件

每个应用包都应包含应用中资源的二进制索引。 此索引在生成时创建,并包含在一个或多个 PRI 文件中。 每个 PRI 文件都包含一个命名资源集合,称为资源映射。

PRI 文件包含实际的字符串资源。 嵌入的二进制文件和文件路径资源直接从项目文件编制索引。 包通常包含每种语言的一个 PRI 文件,名称为 resources.pri。 当实例化 ResourceManager 对象时,会自动加载每个包的根目录的 resources.pri 文件。

PRI 文件仅包含数据,因此它们不使用可移植可执行 (PE) 格式。 它们专为仅数据设计。

注意

对于 .NET 应用,在 Windows 应用 SDK 版本 0.8 及更高版本中,会自动设置 Visual Studio 中资源文件的生成操作文件属性,从而减少手动项目配置的需求。 版本 1.0 引入了 问题 1674。 这是在 1.1 中修复的(从稳定通道),但修补程序需要 .NET SDK 6.0.300 或更高版本。 如果使用的是较低版本的 .NET SDK,请继续使用 1.0 发行说明中的解决方法。

使用 MRT Core 访问应用资源

MRT Core 提供了几种访问应用资源的不同方法。

注意

在 Windows 应用 SDK 1.0 预览版 1 及更高版本中,MRT Core API 位于 Microsoft.Windows.ApplicationModel.Resources 命名空间中。 在低于该版本的版本中,其位于 Microsoft.ApplicationModel.Resources 命名空间中。

ResourceLoader 的基本功能

以编程方式访问应用资源的最简单的方法是使用 ResourceLoader 类。 ResourceLoader 为你提供对资源文件集、引用库或其他包的字符串资源的基本访问权限。

ResourceManager 的高级功能

ResourceManager 类提供有关资源的其他信息,例如枚举和检查。 这超出了 ResourceLoader 类的提供范围。

ResourceCandidate 对象表示单个具体资源值及其限定符,例如英语字符串“Hello World”,或“logo.scale-100.jpg”作为特定于 scale-100 分辨率的限定图像资源。

对应用提供的资源存储在分层集合中,你可以使用 ResourceMap 对象进行访问。 ResourceManager 类提供应用使用的各种顶级 ResourceMap 实例(对应于应用的各种包)的访问权限。 ResourceManager.MainResourceMap 值对应于当前应用包的资源映射,且不包括任何引用的框架包。 每个 ResourceMap 都针对在包清单中指定的包名称进行命名。 在 ResourceMap 内是子树(ResourceMap.GetSubtree)。 子树通常对应于包含资源的资源文件。

ResourceManager 不仅支持访问某个应用的字符串资源,它还维护枚举和检查各种文件资源的能力。 为了避免文件和源自该文件内部的其他资源之间发生冲突,索引的文件路径全部驻留在预留的“文件”ResourceMap 子树中。 例如,文件 "\Images\logo.png" 对应于资源名称 "Files/images/logo.png"。

使用 ResourceContext 限定资源选择

基于作为资源限定符值集合(语言、比例、对比度等)的特定的 ResourceContext 选择候选资源。 除非覆盖,默认上下文对每个限定符值使用应用的当前配置。 例如,可以针对比例限定图像等资源,具体因不同的监视器而异,因此不同应用程序视图之间也有差异。 出于此原因,每个应用程序视图都有不同的默认上下文。 每当你检索候选资源时,都应该传递 ResourceContext 实例,以获取最适合给定视图的值。

示例

有关演示如何使用 MRT Core API 的示例,请参阅 MRT Core 示例

另请参阅