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 名前空間に関するページを参照してください。

注意

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 クラスの場合、ご利用のアプリで正しいコンテキスト (リソース修飾子の値) が決定される必要があり、現在のビューおよびビューに依存しない使用の概念は適用されなくなります。

  • そのため、ResourceContext.GetForCurrentView API または ResourceContext.GetForViewIndependentUse API を使用している場合は、ResourceManager.CreateResourceContext を代わりに使用してください。

リソース修飾子の値

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 API サーフェスの使用方法が示されています。