Risorse e codice
Aggiornamento: novembre 2007
In questi cenni preliminari viene presentata la modalità di accesso alle risorse di Windows Presentation Foundation (WPF) o di creazione delle risorse stesse tramite codice anziché tramite la sintassi Extensible Application Markup Language (XAML). Per ulteriori informazioni sull'utilizzo delle risorse in generale e sulle risorse dal punto di vista della sintassi XAML, vedere Cenni preliminari sulle risorse.
Nel presente argomento sono contenute le seguenti sezioni.
- Accesso alle risorse dal codice
- Creazione delle risorse tramite codice
- Utilizzo di oggetti come chiavi
- Argomenti correlati
Accesso alle risorse dal codice
Le chiavi che consentono di identificare le risorse, se definite tramite XAML, possono essere utilizzate anche per recuperare risorse specifiche qualora si richieda la risorsa nel codice. Il modo più semplice per recuperare una risorsa dal codice consiste nel chiamare il metodo FindResource oppure il metodo TryFindResource da oggetti a livello framework presenti nell'applicazione. La differenza di comportamento tra i due metodi consiste nell'azione eseguita quando la chiave richiesta non viene trovata. FindResource genera un'eccezione, al contrario di TryFindResource che non genera un'eccezione ma restituisce null. Ciascun metodo accetta la chiave di risorsa come parametro di input e restituisce un oggetto debolmente tipizzato. In genere, una chiave di risorsa è costituita da una stringa, ma è possibile che talvolta si verifichino utilizzi non stringa; per informazioni dettagliate, vedere la sezione Utilizzo di oggetti come chiavi. Di regola, il cast dell'oggetto restituito viene eseguito nel tipo richiesto dalla proprietà impostata al momento della richiesta della risorsa. La logica di ricerca per la risoluzione della risorsa del codice è la stessa del codice XAML del riferimento di risorsa dinamica. La ricerca della risorsa ha inizio dall'elemento chiamante e continua quindi con gli elementi padre successivi della struttura ad albero logica. La ricerca prosegue nelle risorse, nei temi e, se necessario, nelle risorse di sistema dell'applicazione. Una richiesta di codice per una risorsa terrà in considerazione le modifiche di runtime eventualmente apportate ai dizionari di risorse successivamente al caricamento di un determinato dizionario di risorse da XAML nonché le modifiche apportate alle risorse di sistema in tempo reale.
Di seguito viene riportato un breve esempio di codice che individua una risorsa in base alla chiave e utilizza il valore restituito per impostare una proprietà, implementata come gestore di eventi Click.
void SetBGByResource(object sender, RoutedEventArgs e)
{
Button b = sender as Button;
b.Background = (Brush)this.FindResource("RainbowBrush");
}
Un metodo alternativo per l'assegnazione di un riferimento di risorsa è SetResourceReference. Tale metodo accetta due parametri: la chiave della risorsa e l'identificatore di una particolare proprietà di dipendenza presente nell'istanza dell'elemento a cui deve essere assegnato il valore della risorsa. A livello funzionale, questo metodo è identico al precedente e presenta il vantaggio di non richiedere il cast dei valori restituiti.
Un ulteriore modo per accedere alle risorse a livello di codice consiste nell'accedere al contenuto della proprietà Resources come dizionario. L'accesso al dizionario incluso in questa proprietà consente anche di aggiungere nuove risorse agli insiemi esistenti, di verificare se un determinato nome di chiave è già accettato nell'insieme e di eseguire altre operazioni sul dizionario o sull'insieme. Se si sta scrivendo un'applicazione WPF interamente in codice, sarà inoltre possibile creare in codice l'intero insieme, assegnare chiavi all'insieme e assegnare infine l'insieme completato alla proprietà Resources di un elemento prestabilito. Questa procedura sarà descritta nella sezione successiva.
Sebbene sia possibile creare un indice all'interno di qualsiasi insieme Resources specificato utilizzando come indice una chiave specifica, è opportuno considerare che tale modalità di accesso alla risorsa non segue le regole di runtime standard di risoluzione della risorsa. Viene effettuato l'accesso solo a quel determinato insieme. La ricerca della risorsa non attraversa l'ambito fino alla radice o all'applicazione se non è stato trovato alcun oggetto valido in corrispondenza della chiave richiesta. Tuttavia, questo approccio in alcuni casi può presentare dei vantaggi in termini di prestazioni, proprio perché l'ambito di ricerca della chiave è più limitato. Per ulteriori informazioni sull'utilizzo diretto del dizionario di risorse, vedere la classe ResourceDictionary.
Creazione delle risorse tramite codice
Se si sta creando in codice un'intera applicazione WPF, sarà possibile creare in codice anche tutte le risorse dell'applicazione. A tal fine, creare una nuova istanza di ResourceDictionary e aggiungere tutte le risorse al dizionario tramite chiamate successive a ResourceDictionary.Add. Utilizzare quindi l'oggetto ResourceDictionary così creato per impostare la proprietà Resources su un elemento presente nell'ambito di una pagina oppure su Application.Resources. È inoltre possibile utilizzare ResourceDictionary come oggetto autonomo, senza aggiungerlo a un elemento. Tuttavia, in questo caso, è necessario accedere alle risorse in esso contenute tramite la chiave dell'elemento, come se si trattasse di un dizionario generico. Un oggetto ResourceDictionary non associato alla proprietà Resources di un elemento non potrà esistere come parte della struttura ad albero di quell'elemento né disporrà di un ambito in una sequenza di ricerca che può essere utilizzata da FindResource e dagli altri metodi correlati.
Utilizzo di oggetti come chiavi
La chiave di una risorsa sarà impostata come stringa nella maggior parte degli utilizzi di quella risorsa. Tuttavia, diverse funzionalità di WPF non utilizzano un tipo stringa per specificare le chiavi; tale parametro sarà piuttosto un oggetto. La possibilità di disporre di un oggetto come chiave della risorsa viene utilizzata dal supporto degli stili e dei temi di WPF. Gli stili dei temi che funzionano da stili predefiniti per un controllo a cui altrimenti non sarebbe applicato alcuno stile utilizzano come chiave l'oggetto Type del controllo al quale dovrebbero essere applicati. L'utilizzo di un tipo come chiave fornisce un meccanismo di ricerca affidabile che funziona sulle istanze predefinite di ciascun tipo di controllo; pertanto, il tipo può essere rilevato mediante reflection e utilizzato per applicare uno stile alle classi derivate, anche se il tipo derivato non disporrebbe altrimenti di uno stile predefinito. È possibile specificare una chiave Type per una risorsa definita in XAML utilizzando l'Estensione del markup x:Type. Esistono estensioni analoghe per altri utilizzi di chiavi di tipo non stringa che supportano funzionalità di WPF quali Estensione del markup ComponentResourceKey.