Dizionari risorse uniti (WPF .NET)

Le risorse di Windows Presentation Foundation (WPF) supportano una funzionalità di dizionario risorse unita. Questa funzionalità consente di definire la parte delle risorse di un'applicazione WPF all'esterno dell'applicazione XAML compilata. Le risorse possono quindi essere condivise nelle applicazioni, oltre che isolate più facilmente per la localizzazione.

Importante

La documentazione di Desktop Guide per .NET 7 e .NET 6 è in fase di costruzione.

Creare un dizionario unito

Nel markup si usa la sintassi seguente 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>

L'elemento ResourceDictionary non dispone di una direttiva x:Key, generalmente necessaria per tutti gli elementi di una raccolta di risorse. Ma un altro ResourceDictionary riferimento all'interno della MergedDictionaries raccolta è un caso speciale, riservato per questo scenario di dizionario risorse unito. Inoltre, l'oggetto ResourceDictionary che introduce un dizionario risorse unito non può avere una direttiva x:Key.

In genere, ogni oggetto ResourceDictionary all'interno della MergedDictionaries raccolta specifica un Source attributo . Il valore di Source deve essere un URI (Uniform Resource Identifier) 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

È legale definire le risorse all'interno di un ResourceDictionary oggetto specificato come dizionario unito, in alternativa a specificare Sourceo oltre a qualsiasi risorsa inclusa dall'origine specificata. Tuttavia, questo non è uno scenario comune. Lo scenario principale per i dizionari uniti consiste nell'unire le risorse da percorsi di file esterni. Se si desidera specificare le risorse all'interno del markup per una pagina, definirli nel dizionario principale ResourceDictionary e non nei dizionari uniti.

Comportamento del dizionario unito

Le risorse in un dizionario unito occupano una posizione nell'ambito di ricerca delle risorse immediatamente dopo l'ambito del dizionario risorse principale in cui vengono uniti. Anche se una chiave di risorsa deve essere univoca in ogni singolo dizionario, una chiave può esistere più volte in un set di dizionari uniti. In questo caso, la risorsa restituita proviene dall'ultimo dizionario trovato in sequenza nella MergedDictionaries raccolta. Se la MergedDictionaries raccolta è stata definita in XAML, l'ordine dei dizionari uniti nella raccolta è l'ordine degli elementi forniti nel markup. Se una chiave viene definita nel dizionario primario e anche in un dizionario unito, la risorsa restituita proviene dal dizionario primario. Queste regole di ambito si applicano ugualmente sia ai riferimenti a risorse statiche che ai riferimenti a risorse dinamiche.

Dizionari uniti e codice

I dizionari uniti possono essere aggiunti a un dizionario Resources tramite il codice. Il valore predefinito inizialmente vuoto ResourceDictionary esistente per qualsiasi Resources proprietà ha anche una proprietà di raccolta inizialmente vuota MergedDictionaries predefinita. Per aggiungere un dizionario unito tramite codice, si ottiene un riferimento all'oggetto primario ResourceDictionarydesiderato, si ottiene il MergedDictionaries valore della proprietà e si chiama Add sul generico Collection contenuto in MergedDictionaries. L'oggetto aggiunto deve essere un nuovo ResourceDictionaryoggetto .

Nel codice non si imposta la Source proprietà . È invece necessario ottenere un ResourceDictionary oggetto creando uno o caricandolo. Un modo per caricare un oggetto esistente da chiamare XamlReader.Load su un flusso di file XAML esistente ResourceDictionary con una ResourceDictionary radice, quindi eseguire il cast del valore restituito su ResourceDictionary.

URI del dizionario uniti

Esistono diverse tecniche per includere un dizionario risorse unito, indicato dal formato URI (Uniform Resource Identifier) usato. In generale, queste tecniche possono essere suddivise in due categorie: le risorse compilate come parte del progetto e le risorse non compilate come parte del progetto.

Per le risorse compilate come parte del progetto, è possibile usare un percorso relativo che fa riferimento alla posizione della risorsa. Il percorso relativo viene valutato durante la compilazione. La risorsa deve essere definita come parte del progetto come azione di compilazione della risorsa . Se si include un file xaml di risorse nel progetto come risorsa, non è necessario copiare il file di risorse nella directory di output, la risorsa è già inclusa nell'applicazione compilata. È anche possibile usare l'azione di compilazione contenuto , ma è necessario copiare i file nella directory di output e distribuire anche i file di risorse nella stessa relazione di percorso con l'eseguibile.

Nota

Non usare l'azione di compilazione della risorsa incorporata. L'azione di compilazione è supportata per le applicazioni WPF, ma la risoluzione di Source non incorpora ResourceManagere pertanto non può separare la singola risorsa dal flusso. È comunque possibile usare la risorsa incorporata per altri scopi, purché sia stato usato ResourceManager anche per accedere alle risorse.

Una tecnica correlata consiste nell'usare un URI pack per un file XAML e farvi riferimento come Origine. L'URI pack consente riferimenti ai componenti di assembly a cui si fa riferimento e ad altre tecniche. Per altre informazioni sugli URI dei pacchetti, vedere Risorsa applicazione WPF, contenuto e file di dati.

Per le risorse non compilate come parte del progetto, l'URI viene valutato in fase di esecuzione. È possibile usare un trasporto URI comune, ad esempio file: o http: per fare riferimento al file di risorse. Lo svantaggio dell'uso dell'approccio alle risorse non compilate è che file: l'accesso richiede passaggi di distribuzione aggiuntivi e http: l'accesso implica l'area di sicurezza Internet.

Riutilizzo di dizionari uniti

È possibile riutilizzare o condividere dizionari risorse uniti tra applicazioni, perché è possibile fare riferimento al dizionario risorse da unire tramite qualsiasi URI (Uniform Resource Identifier) valido. Esattamente come eseguire questa operazione dipende dalla strategia di distribuzione dell'applicazione e dal modello di applicazione seguito. La strategia dell'URI pack menzionata in precedenza consente di creare in genere una risorsa unita tra più 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 di riferimento. È anche possibile fare riferimento alle risorse unite tramite un URI distribuito che usa il protocollo http: .

La scrittura di dizionari uniti come file dell'applicazione locale o nell'archiviazione condivisa locale è un altro possibile scenario di distribuzione di dizionari e applicazioni uniti.

Localizzazione

Se le risorse che devono essere localizzate sono isolate in dizionari uniti in dizionari primari e mantenute come XAML separati, questi file possono essere localizzati separatamente. Questa tecnica è un'alternativa leggera alla localizzazione degli assembly di risorse satellite. Per informazioni dettagliate, vedere Panoramica della globalizzazione e localizzazione WPF.

Vedi anche