Sistema de administración de recursos

El sistema de administración de recursos tiene características en tiempo de compilación y en tiempo de ejecución. En tiempo de compilación, el sistema crea un índice de todas las variantes diferentes de los recursos que se empaquetan con la aplicación. Este índice es el índice de recursos del paquete, o PRI, y también se incluye en el paquete de la aplicación. En tiempo de ejecución, el sistema detecta la configuración de usuario y máquina que está en vigor, consulta la información en el PRI y carga automáticamente los recursos que son la mejor coincidencia para esa configuración.

Archivo de índice de recursos de paquete (PRI)

Cada paquete de aplicación debe contener un índice binario de los recursos de la aplicación. Este índice se crea en tiempo de compilación y se encuentra en uno o varios archivos de índice de recursos de paquete (PRI).

  • Un archivo PRI contiene recursos de cadena reales y un conjunto indizado de rutas de acceso de archivo que hacen referencia a varios archivos del paquete.
  • Un paquete normalmente contiene un único archivo PRI por idioma, denominado resources.pri.
  • El archivo resources.pri en la raíz de cada paquete se carga automáticamente cuando se crea una instancia de ResourceManager .
  • Los archivos PRI se pueden crear y volcar con la herramienta MakePRI.exe.
  • Para el desarrollo de aplicaciones típico, no necesitará MakePRI.exe porque ya está integrado en el flujo de trabajo de compilación de Visual Studio. Y Visual Studio admite la edición de archivos PRI en una interfaz de usuario dedicada. Sin embargo, los localizadores y las herramientas que usan pueden depender de MakePRI.exe.
  • Cada archivo PRI contiene una colección de recursos con nombre que hace referencia a una asignación de recursos. Cuando se carga un archivo PRI de un paquete, se comprueba el nombre del mapa de recursos para que coincida con el nombre de la identidad del paquete.
  • Los archivos PRI solo contienen datos, por lo que no usan el formato portable ejecutable (PE). Están diseñados específicamente para ser solo datos como formato de recursos para Windows. Reemplazan los recursos contenidos en los archivos DLL en el modelo de aplicación Win32.

Acceso a la API de UWP a los recursos de la aplicación

Funcionalidad básica (ResourceLoader)

La manera más sencilla de acceder a los recursos de la aplicación mediante programación es mediante el espacio de nombres Windows.ApplicationModel.Resources y la clase ResourceLoader . ResourceLoader proporciona acceso básico a los recursos de cadena desde el conjunto de archivos de recursos, bibliotecas a las que se hace referencia u otros paquetes.

Funcionalidad avanzada (ResourceManager)

La clase ResourceManager (en el espacio de nombres Windows.ApplicationModel.Resources.Core ) proporciona información adicional sobre los recursos, como la enumeración y la inspección. Esto va más allá de lo que proporciona la clase ResourceLoader .

Un objeto NamedResource representa un recurso lógico individual con varios idiomas u otras variantes calificadas. Describe la vista lógica del recurso o recurso, con un identificador de recurso de cadena como Header1, o un nombre de archivo de recursos como logo.jpg.

Un objeto ResourceCandidate representa un único valor de recurso concreto y sus calificadores, como la cadena "Hola mundo" para inglés o "logo.scale-100.jpg" como un recurso de imagen calificado que es específico de la resolución scale-100.

Los recursos disponibles para una aplicación se almacenan en colecciones jerárquicas, a los que se puede acceder con un objeto ResourceMap . La clase ResourceManager proporciona acceso a las distintas instancias de ResourceMap de nivel superior usadas por la aplicación, que corresponden a los distintos paquetes de la aplicación. El valor MainResourceMap corresponde al mapa de recursos del paquete de aplicación actual y excluye los paquetes de marcos a los que se hace referencia. Cada ResourceMap se denomina para el nombre del paquete que se especifica en el manifiesto del paquete. Dentro de resourceMap son subárboles (vea ResourceMap.GetSubtree), que contienen objetos NamedResource . Los subárboles suelen corresponder a los archivos de recursos que contiene el recurso. Para obtener más información, consulta Localizar cadenas en el manifiesto de paquete de la interfaz de usuario y la aplicación y Cargar imágenes y recursos adaptados para la escala, el tema, el contraste alto y otros.

A continuación se muestra un ejemplo.

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

Nota El identificador de recurso se trata como un fragmento de identificador uniforme de recursos (URI), sujeto a la semántica del URI. Por ejemplo, GetValue("Caption%20") se trata como GetValue("Caption "). No use "?" o "#" en los identificadores de recursos, ya que finalizan la evaluación de la ruta de acceso del recurso. Por ejemplo, "MyResource?3" se trata como "MyResource".

ResourceManager no solo admite el acceso a los recursos de cadena de una aplicación, sino que también mantiene la capacidad de enumerar e inspeccionar también los distintos recursos de archivo. Para evitar colisiones entre archivos y otros recursos que se originan en un archivo, todas las rutas de acceso de archivo indizada residen en un subárbol ResourceMap "Files" reservado. Por ejemplo, el archivo \Images\logo.png corresponde al nombre Files/images/logo.pngdel recurso .

Las API storageFile controlan de forma transparente las referencias a archivos como recursos y son adecuadas para escenarios de uso típicos. ResourceManager solo se debe usar para escenarios avanzados, por ejemplo, si desea invalidar el contexto actual.

ResourceContext

Los candidatos de recursos se eligen en función de un resourceContext determinado, que es una colección de valores de calificador de recursos (idioma, escala, contraste, etc.). Un contexto predeterminado usa la configuración actual de la aplicación para cada valor de calificador, a menos que se invalide. Por ejemplo, los recursos como las imágenes se pueden calificar para la escala, que varía de un monitor a otro y, por tanto, de una vista de aplicación a otra. Por este motivo, cada vista de aplicación tiene un contexto predeterminado distinto. El contexto predeterminado de una vista determinada se puede obtener mediante ResourceContext.GetForCurrentView. Siempre que recupere un candidato de recurso, debe pasar una instancia de ResourceContext para obtener el valor más adecuado para una vista determinada.

API importantes