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 del 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 con nombre de recursos, denominada asignación de recursos. Cuando se carga un archivo PRI de un paquete, se comprueba que el nombre del mapa de recursos 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 recurso para Windows. Reemplazan los recursos contenidos en 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 del 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 enumeración e 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 lenguajes 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 específico de la resolución scale-100.
Los recursos disponibles para una aplicación se almacenan en colecciones jerárquicas, a los que 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 un ResourceMap son subárboles (vea ResourceMap.GetSubtree), que contienen objetos NamedResource. Los subárboles normalmente corresponden a los archivos de recursos que contienen el recurso. Para obtener más información, consulta Localizar cadenas en el manifiesto de paquete de la aplicación y la interfaz de usuario y Carga de imágenes y recursos adaptados para la escala, el tema, el contraste alto y otros.
Este es 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 recursos 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 "?" ni "#" en 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 los distintos recursos de archivo. Para evitar colisiones entre archivos y otros recursos que se originan desde dentro de 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.png
del recurso .
Las API de StorageFile controlan de forma transparente las referencias a archivos como recursos y son adecuadas para escenarios de uso típicos. ResourceManager solo debe usarse para escenarios avanzados, por ejemplo, cuando se quiere 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, lo que varía de un monitor a otro y, por lo 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.