Système de gestion des ressources

Le système de gestion des ressources dispose à la fois de fonctionnalités au moment de la génération et au moment de l’exécution. Au moment de la génération, le système crée un index de toutes les différentes variantes des ressources empaquetées avec votre application. Cet index est l’index de ressources de package, ou PRI, et il est également inclus dans le package de votre application. Au moment de l’exécution, le système détecte les paramètres utilisateur et machine qui sont en vigueur, consulte les informations dans le PRI et charge automatiquement les ressources qui correspondent le mieux à ces paramètres.

Fichier PRI (Package Resource Index)

Chaque package d’application doit contenir un index binaire des ressources de l’application. Cet index est créé au moment de la génération et il est contenu dans un ou plusieurs fichiers PRI (Package Resource Index).

  • Un fichier PRI contient des ressources de chaîne réelles et un ensemble indexé de chemins d’accès de fichiers qui font référence à différents fichiers dans le package.
  • Un package contient généralement un seul fichier PRI par langue, nommé resources.pri.
  • Le fichier resources.pri à la racine de chaque package est automatiquement chargé lorsque le ResourceManager est instancié.
  • Les fichiers PRI peuvent être créés et vidés avec l’outil MakePRI.exe.
  • Pour le développement d’applications standard, vous n’aurez pas besoin d'MakePRI.exe, car il est déjà intégré au flux de travail de compilation Visual Studio. Visual Studio prend en charge la modification des fichiers PRI dans une interface utilisateur dédiée. Toutefois, vos localiseurs et les outils qu’ils utilisent peuvent s’appuyer sur MakePRI.exe.
  • Chaque fichier PRI contient un ensemble nommé de ressources, que l'on qualifie de mappage des ressources. Lorsqu’un fichier PRI à partir d’un package est chargé, le nom de la carte de ressources est vérifié pour correspondre au nom d’identité du package.
  • Les fichiers PRI contiennent uniquement des données, de sorte qu’ils n’utilisent pas le format exécutable portable (PE). Ils sont spécifiquement conçus pour être des données uniquement en tant que format de ressource pour Windows. Ils remplacent les ressources contenues dans les DLL dans le modèle d’application Win32.

Accès de l’API UWP aux ressources d’application

Fonctionnalités de base (ResourceLoader)

Le moyen le plus simple d’accéder à vos ressources d’application par programmation consiste à utiliser l’espace de noms Windows.ApplicationModel.Resources et la classe ResourceLoader . ResourceLoader vous fournit un accès de base aux ressources de chaîne à partir de l’ensemble de fichiers de ressources, de bibliothèques référencées ou d’autres packages.

Fonctionnalités avancées (ResourceManager)

La classe ResourceManager (dans l’espace de noms Windows.ApplicationModel.Resources.Core ) fournit des informations supplémentaires sur les ressources, telles que l’énumération et l’inspection. Cela va au-delà de ce que fournit la classe ResourceLoader .

Un objet NamedResource représente une ressource logique individuelle avec plusieurs langues ou d’autres variantes qualifiées. Il décrit l’affichage logique de la ressource ou de la ressource, avec un identificateur de ressource de chaîne tel que Header1, ou un nom de fichier de ressource tel que logo.jpg.

Un objet ResourceCandidate représente une seule valeur de ressource concrète et ses qualificateurs, tels que la chaîne « Hello World » pour l’anglais ou « logo.scale-100.jpg » en tant que ressource d’image qualifiée spécifique à la résolution scale-100.

Les ressources disponibles pour une application sont stockées dans des collections hiérarchiques auxquelles vous pouvez accéder avec un objet ResourceMap . La classe ResourceManager permet d’accéder aux différentes instances ResourceMap de niveau supérieur utilisées par l’application, qui correspondent aux différents packages de l’application. La valeur MainResourceMap correspond au mappage de ressources pour le package d’application actuel et exclut tous les packages d’infrastructure référencés. Chaque ResourceMap est nommé pour le nom du package spécifié dans le manifeste du package. Dans un ResourceMap se trouvent des sous-arborescences (voir ResourceMap.GetSubtree), qui contiennent également des objets NamedResource . Les sous-arborescences correspondent généralement aux fichiers de ressources qui contiennent la ressource. Pour plus d’informations, consultez Localiser des chaînes dans votre manifeste de package d’interface utilisateur et d’application et Charger des images et des ressources adaptées à l’échelle, au thème, au contraste élevé et autres.

Voici un exemple.

// using Windows.ApplicationModel.Resources.Core;
ResourceMap resourceMap =  ResourceManager.Current.MainResourceMap.GetSubtree("Resources");
ResourceContext resourceContext = ResourceContext.GetForCurrentView()
var str = resourceMap.GetValue("String1", resourceContext).ValueAsString;

Note L’identificateur de ressource est traité comme un fragment URI (Uniform Resource Identifier), soumis à la sémantique de l’URI. Par exemple, GetValue("Caption%20") est traité comme GetValue("Caption "). N’utilisez pas « ? » ou « # » dans les identificateurs de ressource, car ils mettent fin à l’évaluation du chemin de ressource. Par exemple, « MyResource?3 » est traité comme « MyResource ».

Le ResourceManager prend non seulement en charge l’accès aux ressources de chaîne d’une application, mais il conserve également la possibilité d’énumérer et d’inspecter les différentes ressources de fichiers. Afin d’éviter les collisions entre les fichiers et d’autres ressources provenant d’un fichier, les chemins d’accès aux fichiers indexés résident tous dans une sous-arborescence ResourceMap « Files » réservée. Par exemple, le fichier \Images\logo.png correspond au nom Files/images/logo.pngde la ressource .

Les API StorageFile gèrent de manière transparente les références aux fichiers en tant que ressources et conviennent aux scénarios d’utilisation classiques. ResourceManager ne doit être utilisé que pour les scénarios avancés, par exemple lorsque vous souhaitez remplacer le contexte actuel.

ResourceContext

Les candidats de ressources sont choisis en fonction d’un ResourceContext particulier, qui est une collection de valeurs de qualificateur de ressources (langue, échelle, contraste, etc.). Un contexte par défaut utilise la configuration actuelle de l’application pour chaque valeur de qualificateur, sauf si elle est remplacée. Par exemple, les ressources telles que les images peuvent être qualifiées pour une mise à l’échelle, qui varie d’un moniteur à l’autre et donc d’une vue d’application à l’autre. Pour cette raison, chaque vue d’application a un contexte par défaut distinct. Le contexte par défaut d’une vue donnée peut être obtenu à l’aide de ResourceContext.GetForCurrentView. Chaque fois que vous récupérez un candidat de ressource, vous devez passer une instance ResourceContext pour obtenir la valeur la plus appropriée pour une vue donnée.

API importantes