Risorse e codice
Questa panoramica è incentrata sul modo in cui è possibile accedere o creare le risorse di Windows Presentation Foundation (WPF) usando codice anziché la sintassi XAML (Extensible Application Markup Language). Per altre informazioni sull'utilizzo generale delle risorse e sulle risorse dal punto di vista della sintassi XAML, vedere risorse XAML.
Accesso alle risorse dal codice
Le chiavi che identificano le risorse se definite tramite XAML vengono usate anche per recuperare risorse specifiche se si richiede la risorsa nel codice. Il modo più semplice per recuperare una risorsa dal codice consiste nel chiamare il FindResource o il metodo TryFindResource da oggetti a livello di framework nell'applicazione. La differenza comportamentale tra questi metodi è ciò che accade se la chiave richiesta non viene trovata.
FindResource genera un'eccezione; TryFindResource non genererà un'eccezione, ma restituisce null
. Ogni metodo accetta la chiave di risorsa come parametro di input e restituisce un oggetto tipizzato in modo libero. In genere, una chiave di risorsa è una stringa, ma esistono utilizzi occasionali non-stringhe; per informazioni dettagliate, vedere la sezione Uso di oggetti come chiavi. In genere si esegue il cast dell'oggetto restituito al tipo richiesto dalla proprietà impostata durante la richiesta della risorsa. La logica di ricerca per la risoluzione delle risorse del codice è la stessa del caso XAML di riferimento a risorse dinamiche. La ricerca di risorse inizia dall'elemento chiamante, quindi continua a elementi padre successivi nell'albero logico. Se necessario, la ricerca continua nelle risorse dell'applicazione, nei temi e nelle risorse di sistema. Una richiesta di codice per una risorsa tiene correttamente conto delle modifiche di runtime nei dizionari delle risorse che potrebbero essere state effettuate dopo che quel dizionario delle risorse è stato caricato da XAML, e anche dei cambiamenti in tempo reale delle risorse di sistema.
Di seguito è riportato un breve esempio di codice che trova una risorsa per chiave e usa il valore restituito per impostare una proprietà, implementata come gestore eventi Click.
void SetBGByResource(object sender, RoutedEventArgs e)
{
Button b = sender as Button;
b.Background = (Brush)this.FindResource("RainbowBrush");
}
Private Sub SetBGByResource(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim b As Button = TryCast(sender, Button)
b.Background = CType(Me.FindResource("RainbowBrush"), Brush)
End Sub
Un metodo alternativo per l'assegnazione di un riferimento a una risorsa è SetResourceReference. Questo metodo accetta due parametri: la chiave della risorsa e l'identificatore per una particolare proprietà di dipendenza presente nell'istanza dell'elemento a cui deve essere assegnato il valore della risorsa. A livello funzionale, questo metodo è equivalente e ha il vantaggio di non richiedere alcuna conversione dei valori restituiti.
Un altro modo per accedere alle risorse a livello di codice consiste nell'accedere al contenuto della proprietà Resources come dizionario. L'accesso al dizionario contenuto da questa proprietà è anche il modo in cui è possibile aggiungere nuove risorse alle raccolte esistenti, verificare se nella raccolta è già presente un nome di chiave specificato e altre operazioni di dizionario/raccolta. Se si scrive un'applicazione WPF interamente nel codice, è anche possibile creare l'intera raccolta nel codice, assegnarvi le chiavi e quindi assegnare la raccolta completata alla proprietà Resources di un elemento stabilito. Questa operazione verrà descritta nella sezione successiva.
È possibile indicizzare all'interno di una determinata raccolta Resources, usando una chiave specifica come indice, ma è necessario tenere presente che l'accesso alla risorsa in questo modo non segue le normali regole di runtime della risoluzione delle risorse. Si accede solo a tale raccolta specifica. La ricerca delle risorse non attraverserà l'ambito fino alla radice o all'applicazione se non viene trovato alcun oggetto valido con la chiave richiesta. Tuttavia, questo approccio può avere vantaggi in termini di prestazioni in alcuni casi proprio perché l'ambito della ricerca della chiave è più vincolato. Per altre informazioni su come usare direttamente il dizionario risorse, vedere la classe ResourceDictionary.
Creazione di risorse con codice
Se si vuole creare un'intera applicazione WPF nel codice, è anche possibile creare qualsiasi risorsa in tale applicazione nel codice. Per raggiungere questo obiettivo, creare una nuova istanza di ResourceDictionary e quindi aggiungere tutte le risorse al dizionario usando chiamate successive a ResourceDictionary.Add. Usare quindi il ResourceDictionary creato per impostare la proprietà Resources su un elemento presente in un ambito di pagina o il Application.Resources. È anche possibile gestire il ResourceDictionary come oggetto autonomo senza aggiungerlo a un elemento. Tuttavia, se si esegue questa operazione, è necessario accedere alle risorse all'interno di essa in base alla chiave dell'elemento, come se fosse un dizionario generico. Un ResourceDictionary non associato a una proprietà dell'elemento Resources
non esisterebbe come parte dell'albero degli elementi e non avrebbe alcun contesto nell'ambito di una sequenza di ricerca che può essere utilizzata da FindResource e dai metodi correlati.
Uso di oggetti come chiavi
La maggior parte degli utilizzi delle risorse imposta la chiave della risorsa come stringa. Tuttavia, diverse funzionalità WPF non usano deliberatamente un tipo stringa per specificare le chiavi, ma questo parametro è un oggetto . La capacità di un oggetto di fungere da chiave per la risorsa viene utilizzata dal supporto per lo stile e la tematizzazione in WPF. Gli stili nei temi che diventano lo stile predefinito per un controllo che altrimenti non avrebbe stile sono ognuno identificato dal Type del controllo a cui devono essere applicati. Essere indicizzati per tipo fornisce un meccanismo di ricerca affidabile che funziona sulle istanze predefinite di ogni tipo di controllo, e il tipo può essere rilevato tramite riflessione e usato per applicare stili alle classi derivate anche se il tipo derivato non possiede altrimenti uno stile predefinito. È possibile specificare una chiave Type per una risorsa definita in XAML usando l'estensione di markup x:type . Sono disponibili estensioni simili per altri utilizzi di chiavi nonstring che supportano funzionalità WPF, ad esempio ComponentResourceKey Markup Extension.
Vedere anche
- risorse XAML
- Stilizzazione e Modelli
.NET Desktop feedback