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, vedi 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 o FindResource il TryFindResource metodo da oggetti a livello di framework nell'applicazione. La differenza di comportamento tra i due metodi sta nell'azione eseguita quando 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 debolmente tipizzato. In genere una chiave di risorsa è una stringa, ma esistono utilizzi occasionali di tipo non stringa. Per informazioni dettagliate, vedere la sezione Uso 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 delle risorse del codice equivale al caso XAML di riferimento di risorse dinamiche. La ricerca delle risorse ha inizio dall'elemento chiamante e continua con gli elementi padre successivi dell'albero logico. Prosegue quindi nelle risorse, nei temi e, se necessario, nelle risorse di sistema dell'applicazione. Una richiesta di codice per una risorsa tiene conto correttamente delle modifiche di runtime nei dizionari risorse che potrebbero essere state effettuate successivamente al caricamento del dizionario risorse da XAML e anche per le modifiche delle risorse di sistema in tempo reale.

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 Click gestore eventi.

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 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 altro modo per accedere alle risorse a livello di codice consiste nell'accedere al contenuto della Resources proprietà come dizionario. L'accesso al dizionario incluso in questa proprietà consente anche di aggiungere nuove risorse alle raccolte esistenti, di verificare se un determinato nome di chiave è già usato nella raccolta e di eseguire altre operazioni sul dizionario o sulla raccolta. Se si scrive un'applicazione WPF interamente nel codice, è anche possibile creare l'intera raccolta nel codice, assegnarvi chiavi e quindi assegnare la raccolta completata alla Resources proprietà di un elemento stabilito. Questa procedura sarà descritta nella sezione successiva.

È possibile indicizzare all'interno di una determinata Resources raccolta, 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. Viene eseguito l'accesso solo a quella particolare risorsa. 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. Questo approccio, tuttavia, in alcuni casi può presentare vantaggi in termini di prestazioni, proprio perché l'ambito di ricerca della chiave è più limitato. Per altre informazioni su come usare direttamente il dizionario risorse, vedere la ResourceDictionary classe .

Creazione delle risorse tramite codice

Se si vuole creare un'intera applicazione WPF nel codice, è anche possibile creare qualsiasi risorsa in tale applicazione nel codice. A tale scopo, creare una nuova ResourceDictionary istanza e quindi aggiungere tutte le risorse al dizionario usando chiamate successive a ResourceDictionary.Add. Usare quindi l'oggetto ResourceDictionary creato per impostare la Resources proprietà su un elemento presente in un ambito di pagina o .Application.Resources È anche possibile mantenere come ResourceDictionary oggetto autonomo senza aggiungerlo a un elemento . In questo caso, tuttavia, è necessario accedere alle risorse al suo interno tramite la chiave dell'elemento, come se si trattasse di un dizionario generico. Un ResourceDictionary oggetto non associato a una proprietà dell'elemento Resources non esiste come parte dell'albero degli elementi e non ha ambito in una sequenza di ricerca che può essere utilizzata dai FindResource metodi correlati e .

Uso di oggetti come chiavi

La chiave di una risorsa sarà impostata come stringa nella maggior parte degli utilizzi di quella risorsa. Tuttavia, diverse funzionalità WPF non usano deliberatamente un tipo stringa per specificare le chiavi, ma questo parametro è un oggetto . La funzionalità di chiave della risorsa da parte di un oggetto viene usata dallo stile WPF e dal supporto di tema. Gli stili nei temi che diventano lo stile predefinito per un controllo altrimenti non in stile sono ognuno con chiave dal Type del controllo a cui devono essere applicati. L'uso di un tipo come chiave offre un meccanismo di ricerca affidabile che funziona sulle istanze predefinite di ogni tipo di controllo, pertanto il tipo può essere rilevato mediante reflection e usato per applicare uno stile alle classi derivate, anche se il tipo derivato non disporrebbe altrimenti di uno stile predefinito. Puoi specificare una Type chiave per una risorsa definita in XAML usando l'estensione di markup x:Type. Esistono estensioni simili per altri utilizzi di chiavi nonstring che supportano funzionalità WPF, ad esempio ComponentResourceKey Markup Extension.

Vedi anche