Système de gestion des ressources
Le système de gestion des ressources a des 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 variantes différentes des ressources empaquetées avec votre application. Cet index est l’index de ressource 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 fichier 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 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 de MakePRI.exe, car il est déjà intégré au flux de travail de compilation Visual Studio. Et Visual Studio prend en charge la modification de 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 une collection nommée de ressources, appelée carte de ressources. Lorsqu’un fichier PRI à partir d’un package est chargé, le nom du mappage de ressources est vérifié pour correspondre au nom de l’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 comme 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 offre 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 ressources tel que logo.jpg
.
Un objet ResourceCandidate représente une valeur de ressource concrète unique et ses qualificateurs, tels que la chaîne « Hello World » pour l’anglais ou « logo.scale-100.jpg » comme 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 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 sont des sous-arborescences (voir ResourceMap.GetSubtree), qui contiennent davantage des objets NamedResource. Les sous-arborescences correspondent généralement aux fichiers de ressources qui contiennent la ressource. Pour plus d’informations, consultez Localiser les 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 à d’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;
Notez que l’identificateur de ressource est traité comme un fragment URI (Uniform Resource Identifier), sujet à 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 terminent l’évaluation du chemin de ressource. Par exemple, « MyResource ?3 » est traité comme « MyResource ».
ResourceManager prend non seulement en charge l’accès aux ressources de chaîne d’une application, mais également la possibilité d’énumérer et d’inspecter les différentes ressources de fichiers. Pour éviter les collisions entre les fichiers et d’autres ressources provenant d’un fichier, les chemins d’accès de fichiers indexés se trouvent tous dans une sous-arborescence ResourceMap réservée. Par exemple, le fichier \Images\logo.png
correspond au nom Files/images/logo.png
de la ressource.
Les API StorageFile gèrent en toute transparence 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 aux ressources sont choisis en fonction d’un ResourceContext particulier, qui est une collection de valeurs de qualificateur de ressource (langage, échelle, contraste, etc.). Un contexte par défaut utilise la configuration actuelle de l’application pour chaque valeur de qualificateur, sauf substitution. Par exemple, les ressources telles que les images peuvent être qualifiées pour la mise à l’échelle, qui varient d’un moniteur à l’autre, et donc d’une vue d’application à une 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 à la ressource, vous devez passer une instance ResourceContext pour obtenir la valeur la plus appropriée pour une vue donnée.