Sistema gestione risorse

Il sistema di gestione risorse include funzionalità in fase di compilazione e di runtime. In fase di compilazione, il Sistema crea un indice di tutte le varianti diverse delle risorse disponibili nel pacchetto della tua app. Questo indice è l'indice delle risorse del pacchetto o PRI ed è incluso anche nel pacchetto dell'app. In fase di esecuzione, il sistema rileva le impostazioni utente e macchina attive, consulta le informazioni nel PRI e carica automaticamente le risorse che corrispondono meglio a tali impostazioni.

File PRI (Package Resource Index)

Ogni pacchetto dell'app deve contenere un indice binario delle risorse nell'app. Questo indice viene creato in fase di compilazione ed è contenuto in uno o più file PRI (Package Resource Index).

  • Un file PRI contiene risorse stringa effettive e un set indicizzato di percorsi di file che fanno riferimento a vari file nel pacchetto.
  • Un pacchetto contiene in genere un singolo file PRI per ogni lingua, denominato resources.pri.
  • Il file resources.pri nella radice di ogni pacchetto viene caricato automaticamente quando viene creata un'istanza di ResourceManager.
  • I file PRI possono essere creati e scaricati con lo strumento MakePRI.exe.
  • Per lo sviluppo tipico di app non è necessario MakePRI.exe perché è già integrato nel flusso di lavoro di compilazione di Visual Studio. Visual Studio supporta la modifica dei file PRI in un'interfaccia utente dedicata. Tuttavia, i localizzatori e gli strumenti usati possono basarsi su MakePRI.exe.
  • Ogni file PRI contiene una raccolta denominata di risorse, denominata mappa delle risorse. Quando viene caricato un file PRI da un pacchetto, il nome della mappa delle risorse viene verificato in modo che corrisponda al nome dell'identità del pacchetto.
  • I file PRI contengono solo dati, quindi non usano il formato PE (Portable Executable). Sono progettati specificamente per essere solo dati come formato di risorsa per Windows. Sostituiscono le risorse contenute nelle DLL nel modello di app Win32.

Accesso dell'API UWP alle risorse dell'app

Funzionalità di base (ResourceLoader)

Il modo più semplice per accedere alle risorse dell'app a livello di codice consiste nell'usare lo spazio dei nomi Windows.ApplicationModel.Resources e la classe ResourceLoader. ResourceLoader fornisce l'accesso di base alle risorse stringa dal set di file di risorse, dalle librerie di riferimento o da altri pacchetti.

Funzionalità avanzate (ResourceManager)

La classe ResourceManager (nello spazio dei nomi Windows.ApplicationModel.Resources.Core) fornisce informazioni aggiuntive sulle risorse, ad esempio l'enumerazione e l'ispezione. Questo va oltre ciò che la classe ResourceLoader fornisce.

Un oggetto NamedResource rappresenta una singola risorsa logica con più lingue o altre varianti qualificate. Descrive la visualizzazione logica dell'asset o della risorsa, con un identificatore di risorsa stringa, Header1ad esempio , o un nome di file di risorse, ad esempio logo.jpg.

Un oggetto ResourceCandidate rappresenta un singolo valore di risorsa concreto e i relativi qualificatori, ad esempio la stringa "Hello World" per l'inglese o "logo.scale-100.jpg" come risorsa immagine qualificata specifica per la risoluzione di scala 100 .

Le risorse disponibili per un'app vengono archiviate in raccolte gerarchica, a cui è possibile accedere con un oggetto ResourceMap . La classe ResourceManager fornisce l'accesso alle varie istanze di ResourceMap di primo livello usate dall'app, che corrispondono ai vari pacchetti per l'app. Il valore MainResourceMap corrisponde alla mappa delle risorse per il pacchetto dell'app corrente ed esclude tutti i pacchetti framework a cui si fa riferimento. Ogni ResourceMap viene denominato per il nome del pacchetto specificato nel manifesto del pacchetto. All'interno di un oggetto ResourceMap sono sottoalberi (vedere ResourceMap.GetSubtree), che contengono ulteriormente oggetti NamedResource. I sottoalberi corrispondono in genere ai file di risorse che contengono la risorsa. Per altre info, vedi Localizzare le stringhe nell'interfaccia utente e nel manifesto del pacchetto dell'app e Caricare immagini e asset personalizzati per la scalabilità, il tema, il contrasto elevato e altri.

Ecco un esempio.

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

Nota L'identificatore di risorsa viene considerato come frammento URI (Uniform Resource Identifier), soggetto alla semantica URI. Ad esempio, GetValue("Caption%20") viene considerato come GetValue("Caption "). Non usare "?" o "#" negli identificatori di risorsa, perché terminano la valutazione del percorso della risorsa. Ad esempio, "MyResource?3" viene considerato come "MyResource".

ResourceManager non solo supporta l'accesso alle risorse stringa di un'app, ma mantiene anche la possibilità di enumerare ed esaminare anche le varie risorse file. Per evitare conflitti tra file e altre risorse che provengono dall'interno di un file, tutti i percorsi di file indicizzati si trovano all'interno di un sottoalbero "Files"ResourceMap riservato. Ad esempio, il file \Images\logo.png corrisponde al nome Files/images/logo.pngdella risorsa .

Le API Archiviazione File gestiscono in modo trasparente i riferimenti ai file come risorse e sono appropriate per gli scenari di utilizzo tipici. ResourceManager deve essere usato solo per scenari avanzati, ad esempio quando si vuole eseguire l'override del contesto corrente.

ResourceContext

I candidati alle risorse vengono scelti in base a un determinato ResourceContext, ovvero una raccolta di valori qualificatori di risorse (lingua, scala, contrasto e così via). Un contesto predefinito usa la configurazione corrente dell'app per ogni valore qualificatore, a meno che non venga sottoposto a override. Ad esempio, le risorse come le immagini possono essere qualificate per la scalabilità, che variano da un monitor a un altro e quindi da una visualizzazione dell'applicazione a un'altra. Per questo motivo, ogni visualizzazione applicazione ha un contesto predefinito distinto. È possibile ottenere il contesto predefinito per una determinata visualizzazione usando ResourceContext.GetForCurrentView. Ogni volta che si recupera un candidato alla risorsa, è necessario passare un'istanza di ResourceContext per ottenere il valore più appropriato per una determinata visualizzazione.

API importanti