Windows 8 操作系统引入了一种用于 Windows 应用商店应用程序的新资源模型,取代了 .NET Framework 桌面应用程序通用的集散模型。本主题讨论了这一新资源模型,并说明在 Windows 应用商店应用程序中如何创建、部署和检索资源。
Windows 应用商店应用程序中的资源
.NET Framework 桌面应用程序使用集散模型来打包和部署资源。通常,应用程序的非特定区域性资源(如果不提供本地化资源,则使用该区域的资源)会嵌入到应用程序的主可执行文件中。每个附加区域性的本地化资源都嵌入到独立的附属程序集中,该程序集中只包含资源,不包含可执行代码。
与此相反,Windows 应用商店应用程序使用单个资源文件。此文件称为包资源索引 (PRI) 文件,存储所有语言、区域性和缩放比例的资源。
重要
资源回退规则确定在找不到特定区域性或当前区域性的本地化资源时加载哪些资源。
在桌面应用程序中,可以使用文本文件或 XML (.resx) 文件创建资源。资源文件生成器 (Resgen.exe) 用于将这些文件编译为二进制资源 (.resources) 文件。使用编译器将非特定区域性的资源嵌入主应用程序集中,并使用程序集链接器 (AL.exe) 将所有其他本地化资源嵌入附属程序集中。然后,可以使用 ResourceManager 类检索各个资源,或使用 ResourceReader 类枚举资源。
在 Windows 应用商店应用程序中,使用 .resw 文件创建资源。尽管文件扩展名不同,但 .resw 文件格式与 .resx 文件格式相同,不同之处在于 .resw 文件只包含字符串和文件路径。可以使用 Visual Studio 资源编辑器创建和编辑资源。在编译时,应用程序的所有 .resw 文件都由 MakePRI 实用工具打包为单个 PRI 文件并包含在应用程序的部署包中。在运行时,Windows.ApplicationModel.Resources.ResourceLoader 类和 Windows.ApplicationModel.Resources.Core 命名空间中的类型提供对应用程序资源的访问。
重要
虽然资源文件生成器 (Resgen.exe) 主要用在桌面应用程序中,但也可以使用此工具将附属程序集反编译为 .resw 文件,然后可将这些文件编译为 PRI 文件。
警告
虽然 ResourceManager 类包含在 适用于 Windows 应用商店应用的 .NET中,但建议不要使用它。仅在作为 可移植类库 项目开发并且面向多个平台的库中使用 ResourceManager。
创建资源文件
Visual Studio 的资源编辑器提供了创建 .resw 文件的最简单、最方便方式。这些编辑器提供一个用户界面,其中隐藏 .resw 文件的基础 XML 文件格式。使用 Visual Studio 创建和编辑资源文件有两个主要优点:
不再需要手动创建资源文件和确保其 XML 格式有效。
它处理的具体过程是:使用 MakePRI 实用工具编译资源、将其打包为 PRI 文件,然后将其包括在应用程序的部署包中。
若要为 Windows 应用商店应用程序创建资源文件,请在**“解决方案资源管理器”中打开项目的快捷菜单,选择“添加”、“新建项”,然后从项目列表中选择“资源文件”**。
在桌面应用程序中,使用 NeutralResourcesLanguageAttribute 特性定义应用程序的非特定区域性。在 Windows 应用商店应用程序中,创建 PRI 文件以及使用 Windows ResourceLoader 类用于提取资源时,将会忽略此特性。
在 Windows 应用商店应用程序中,你可以创建文件夹来存储受支持区域性的资源和映像,从而指定本地化资源文件的名称。然后,你可以使用区域性名称(如“ko-kr”)后跟默认资源名称和资源文件扩展名(如“ko-kr\Resources.resw”)的方式来描述资源。
部署资源文件
Visual Studio 为属于 Visual Studio 项目的资源文件处理应用程序部署的所有详细信息。它自动为属于项目的所有资源生成配置文件,使用 MakePRI 工具将资源包括在单个 PRI 文件中,并将该 PRI 文件放在应用程序的部署包中。
由于所有资源都包括在单个 PRI 文件中而不是各个文件的集合中,因此修改现有资源文件或通过添加资源文件来添加对新本地化区域性的支持需要重新生成并重新发布整个应用程序。
从资源文件中检索资源
若要在 Windows 应用商店应用程序中检索资源,请实例化一个 Windows 运行时 Windows.ApplicationModel.Resources.ResourceLoader 对象或 Windows.ApplicationModel.Resources.Core 命名空间中的类型之一。虽然 Windows 应用商店应用程序支持 .NET Framework ResourceManager 类,但我们不建议使用它。仅在开发面向多个平台的 可移植类库 项目时使用 ResourceManager。下表列出了 ResourceManager 成员及其在 Windows.ApplicationModel.Resources.ResourceLoader 类中的简单等效项或在 Windows.ApplicationModel.Resources.Core 命名空间中的类型。
ResourceManager 成员 |
ResourceLoader 或其他 Windows 运行时类型的等效成员 |
---|---|
ResourceManager.GetString(String) |
Windows.ApplicationModel.Resources.ResourceLoader.GetString(String) |
ResourceManager.GetString(String, CultureInfo) |
Windows.ApplicationModel.Resources.Core.ResourceMap.GetValue(String, ResourceContext) |
ResourceManager.#ctor(String, Assembly) |
Windows.ApplicationModel.Resources.ResourceLoader.ResourceLoader() - 或 - Windows.ApplicationModel.Resources.ResourceLoader.ResourceLoader(String) |
简单的“Hello World”示例
下面是显示本地化字符串的 Windows 应用商店应用程序的简单示例。其非特定区域性是俄语(俄罗斯),但它还包括用于英语(美国)和法语(法国)区域性的资源。如果在当前区域性为英语(美国)的系统上运行该应用程序,则用英语显示问候语;否则,将显示默认的俄语问候语。最后,无论当前区域性为何,它都使用 Windows.ApplicationModel.Resources.Core.ResourceContext 和 Windows.ApplicationModel.Resources.Core.ResourceMap 对象用法语显示问候语。
若要向 TextBlock 控件中显示输出,该示例需要将以下 <TextBlock> 标记添加到 BlankPage.xaml 中:
<Grid Background="{StaticResource PageBackgroundBrush}">
<TextBlock x:Name="outputBlock" />
</Grid>
然后,从 BlankPage 类构造函数中调用应用程序代码,如下所示:
该示例需要创建以下资源:
名为“Greeting”、值为“Привет!”的俄语资源。应将该字符串添加到项目根级别中名为 Resources.resw 的资源文件中。
名为“Greeting”、值为“Hi there!”的英语资源。若要创建资源文件,请将名为 en-US 的文件夹添加到你的项目中,然后将一个名为 Resources.resw 的资源文件添加到该文件夹中。
名为“Greeting”、值为“Bonjour!”的法语资源。若要创建资源文件,请将名为 fr-FR 的文件夹添加到你的项目中,然后将一个名为 Resources.resw 的资源文件添加到该文件夹中。
以下示例显示 TextBlock 控件中的相应本地化字符串。
在编译和运行应用程序时,它在区域性为 en-US 的系统中会按如下所示显示输出:
The current culture is en-US.
Hi there!
Culture of Current Context: fr-FR
Bonjour!