MRT 到 MRT Core 的迁移

本主题包含从 UWP 的资源管理系统(也称为 MRT)迁移到 Windows 应用 SDK MRT Core 的指南。

MRT Core 是 MRT 的简化版本。 有关详细信息,请参见使用 MRT Core 管理资源

API 和/或功能差异摘要

为方便迁移,MRT Core API 与 MRT API 非常相似。 有关 API 参考文档,请参阅 Microsoft.Windows.ApplicationModel.Resources namespace

注意

并非所有 MRT API 都存在于 MRT Core 中。 但包含 MRT 基本功能所需的所有 API。

更改命名空间

在 UWP 中,MRT API 位于 Windows.ApplicationModel.Resources.Core 命名空间中。 在 Windows 应用 SDK 中,MRT Core API 位于 Microsoft.Windows.ApplicationModel.Resources 命名空间中。 因此需要在源代码中更改该命名空间名称(在开头添加 Microsoft.,并删除末尾的 .Core)。

注意

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

ResourceManager 类

如果在 UWP 应用中使用 Windows.ApplicationModel.Resources.Core.ResourceManager.Current 属性,则此部分适用。

// In a UWP app
using Windows.ApplicationModel.Resources.Core;
...
var currentResourceManager = ResourceManager.Current;
// In a UWP app
#include <winrt/Windows.ApplicationModel.Resources.Core.h>
using namespace winrt::Windows::ApplicationModel::Resources::Core;
...
auto currentResourceManager{ ResourceManager::Current() };

而在 Windows 应用 SDK 应用中,创建新的 Microsoft.Windows.ApplicationModel.Resources.ResourceManager

// In a Windows App SDK app
using Microsoft.Windows.ApplicationModel.Resources;
...
var currentResourceManager = new ResourceManager();
// In a Windows App SDK app
#include <winrt/Microsoft.Windows.ApplicationModel.Resources.h>
using namespace winrt::Microsoft::Windows::ApplicationModel::Resources;
...
ResourceManager currentResourceManager;

ResourceContext.GetForCurrentView 和 ResourceContext.GetForViewIndependentUse

UWP MRT ResourceContext 类区分当前视图和独立于视图使用的 ResourceContext

对于 Windows 应用 SDK 的 MRT Core ResourceContext 类,应用需要确定正确的上下文(资源限定符值),并且当前视图和独立于视图使用的概念不再适用。

资源限定符值

在 UWP 的 MRT 中,为应用确定资源上下文限定符值。 在 MRT Core 中,仅填充语言值。 应用需要确定自身的其他值。 以下示例假定 XAML 视图包含一个名为 layoutRoot 的元素。

// In a Windows App SDK app
using Microsoft.Windows.ApplicationModel.Resources;
...
var currentResourceManager = new ResourceManager();
var resourceContext = currentResourceManager.CreateResourceContext();
int scaleFactor = Convert.ToInt32(layoutRoot.XamlRoot.RasterizationScale * 100);
resourceContext.QualifierValues[KnownResourceQualifierName.Scale] = scaleFactor.ToString();
string s = resourceContext.QualifierValues[KnownResourceQualifierName.Scale];
// In a Windows App SDK app
#include <winrt/Microsoft.Windows.ApplicationModel.Resources.h>
using namespace winrt::Microsoft::Windows::ApplicationModel::Resources;
...
ResourceManager currentResourceManager;
auto resourceContext{ currentResourceManager.CreateResourceContext() };
auto scaleFactor{ layoutRoot().XamlRoot().RasterizationScale() * 100 };
resourceContext.QualifierValues().Insert(L"Scale", std::to_wstring((int)scaleFactor));
auto s{ resourceContext.QualifierValues().Lookup(L"Scale") };

资源限定符值更改

UWP MRT 提供 ResourceQualifierObservableMap.MapChanged 事件。 如果 UWP 应用正在处理该事件以侦听限定符值更改,则本部分适用。

MRT Core 不提供有关环境更改的任何通知机制。 因此,Windows 应用 SDK 应用需要自行检测此类更改,以便根据环境更改更新资源。

MRT Core 示例应用

另请参阅使用 MRT Core 加载资源示例应用项目,该项目演示如何使用 MRT Core API 图面。