Dizionari risorse uniti
Le risorse Windows Presentation Foundation (WPF) supportano una funzionalità di unione dei dizionari risorse. Tale funzionalità consente di definire la porzione di risorse di un'applicazione WPF esterna all'applicazione XAML compilata. Le risorse possono essere quindi condivise tra le applicazioni e sono anche isolate in modo tale da facilitare la localizzazione.
Introduzione ai dizionari risorse uniti
A livello di markup, è possibile utilizzare la sintassi riportata di seguito per introdurre un dizionario risorse unito in una pagina:
<Page.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="myresourcedictionary.xaml"/>
<ResourceDictionary Source="myresourcedictionary2.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Page.Resources>
Notare che l'elemento ResourceDictionary non dispone di un Direttiva x:Key, richiesto in genere per tutti gli elementi inclusi in un insieme di risorse. Tuttavia un ulteriore riferimento ResourceDictionary all'interno dell'insieme MergedDictionaries rappresenta un caso particolare, riservato a questo scenario di dizionari risorse uniti. L'oggetto ResourceDictionary che introduce un dizionario risorse unito non può disporre di un oggetto Direttiva x:Key. In genere, ogni elemento ResourceDictionary all'interno dell'insieme MergedDictionaries specifica un attributo Source. Il valore di Source deve essere un uniform resource identifier (URI) che si risolve nel percorso del file di risorse da unire. La destinazione di tale URI deve essere un altro file XAML, con ResourceDictionary come elemento radice.
Nota |
---|
È consentito definire le risorse all'interno di un oggetto ResourceDictionary specificato come dizionario unito o come alternativa alla specifica di Source oppure in aggiunta a qualsiasi risorsa che venga inclusa dall'origine specificata.Non si tratta tuttavia di uno scenario comune. Nello scenario principale per i dizionari uniti, l'unione delle risorse avviene da percorsi di file esterni.Se si desidera specificare delle risorse all'interno del markup di una pagina, è necessario in genere definirle nell'oggetto ResourceDictionary principale e non nei dizionari uniti. |
Comportamento dei dizionari uniti
Le risorse di un dizionario unito occupano, nell'ambito di ricerca delle risorse, una posizione immediatamente successiva all'ambito del dizionario risorse principale al quale sono unite. Anche se la chiave di risorsa deve essere univoca per ogni singolo dizionario, una chiave può essere presente più volte in un insieme di dizionari uniti. In questo caso, l'origine della risorsa restituita sarà contenuta nell'ultimo dizionario rilevato nella sequenza dell'insieme MergedDictionaries. Se l'insieme MergedDictionaries è stato definito in XAML, l'ordine dei dizionari uniti dell'insieme corrisponde all'ordine degli elementi fornito nel markup. Se una chiave è definita nel dizionario principale e anche in un dizionario unito, l'origine della risorsa restituita sarà il dizionario principale. Tali regole di ambito si applicano parimenti sia ai riferimenti a risorse statiche, sia ai riferimenti a risorse dinamiche.
Dizionari uniti e codice
È possibile aggiungere i dizionari uniti a un dizionario Resources tramite codice. L'oggetto ResourceDictionary predefinito, che all'inizio è vuoto, previsto per qualsiasi proprietà Resources, dispone di una proprietà dell'insieme MergedDictionaries predefinito, anch'esso inizialmente vuoto. Per aggiungere un dizionario unito tramite codice, è necessario ottenere un riferimento all'oggetto ResourceDictionary principale, acquisire il relativo valore per la proprietà MergedDictionaries e chiamare quindi Add sull'Collection generico contenuto in MergedDictionaries. L'oggetto aggiunto deve essere un oggetto ResourceDictionary nuovo. Quando si lavora in codice, non occorre impostare la proprietà Source. È necessario invece ottenere un oggetto ResourceDictionary creandolo oppure caricandolo. Un modo per caricare un oggetto ResourceDictionary esistente consiste nel chiamare XamlReader.Load in un flusso di file XAML avente una radice ResourceDictionary e nell'eseguire quindi il cast del valore restituito XamlReader.Load in ResourceDictionary.
URI dei dizionari risorse uniti
Esistono diverse tecniche relative alla modalità di inclusione di un dizionario risorse unito, indicate dal formato uniform resource identifier (URI) che verrà utilizzato. In generale, queste tecniche possono essere suddivise in due categorie: risorse compilate come parte del progetto e risorse non compilate come parte del progetto.
Per le risorse compilate come parte del progetto, è possibile utilizzare un percorso relativo che fa riferimento alla posizione della risorsa. Il percorso relativo viene valutato in fase di compilazione. La risorsa deve essere definita come parte del progetto come Operazione di compilazione risorsa. Se si include nel progetto un file di risorse xaml come Risorsa, non sarà necessario copiare tale file nella directory di output, perché la risorsa sarà già inclusa all'interno dell'applicazione compilata. Sarà anche possibile utilizzare Operazione di compilazione contenuto, ma a tal fine sarà necessario copiare i file nella directory di output e distribuire inoltre i file di risorse nella stessa relazione di percorso del file eseguibile.
Nota |
---|
Non utilizzare l'operazione di compilazione Risorsa incorporata.L'operazione di compilazione stessa è supportata in applicazioni WPF, ma la risoluzione di Source non incorpora ResourceManager e pertanto non è in grado di separare la singola risorsa dal flusso.È tuttavia possibile usare Risorsa incorporata per altri scopi, a condizione che si utilizzi anche ResourceManager per accedere alle risorse. |
Una tecnica correlata consiste nell'utilizzare un URI di tipo pack in un file XAML e fare riferimento ad esso come Origine. L'URI di tipo pack abilita i riferimenti ai componenti degli assembly a cui si fa riferimento e consente l'utilizzo di altre tecniche. Per ulteriori informazioni sugli URI di tipo pack, vedere File di dati e di risorse dell'applicazione WPF..
Per le risorse che non sono compilate come parte del progetto, l'URI viene valutato in fase di esecuzione. È possibile utilizzare un trasporto URI comune, ad esempio file: o http: per fare riferimento al file di risorse. Lo svantaggio dell'approccio alle risorse non compilate consiste nel fatto che l'accesso tramite file: richiede un'ulteriore procedura di distribuzione, mentre l'accesso tramite http: coinvolge l'area di sicurezza Internet.
Riutilizzo dei dizionari uniti
È possibile riutilizzare o condividere i dizionari di risorse uniti tra diverse applicazioni, dal momento che il riferimento al dizionario risorse da unire può essere fornito tramite qualsiasi uniform resource identifier (URI) valido. Il modo esatto di eseguire questa operazione dipende dalla strategia di distribuzione dell'applicazione e dal modello di applicazione adottato. La strategia URI di tipo pack indicata in precedenza fornisce un metodo per specificare un'origine comune di una risorsa unita in diversi progetti durante lo sviluppo condividendo un riferimento all'assembly. In questo scenario le risorse vengono ancora distribuite dal client e almeno una delle applicazioni deve distribuire l'assembly a cui si fa riferimento. È inoltre possibile fare riferimento alle risorse unite tramite un URI distribuito che utilizza il protocollo HTTP.
La scrittura di dizionari uniti come file di applicazioni locali oppure nell'archivio locale condiviso costituisce un altro scenario di distribuzione di applicazioni o dizionari uniti.
Localizzazione
Se le risorse da localizzare sono isolate ai dizionari uniti nei dizionari principali e tenute come XAML separato, sarà possibile localizzare tali file separatamente. Questa tecnica rappresenta una semplice alternativa alla localizzazione degli assembly di risorse satellite. Per informazioni dettagliate, vedere Cenni preliminari sulla globalizzazione e localizzazione WPF.