Risorse nel codice (WPF .NET)

Questa panoramica è incentrata sul modo in cui è possibile accedere o creare le risorse di Windows Presentation Foundation (WPF) usando codice anziché la sintassi XAML. Per altre informazioni sull'utilizzo generale delle risorse e sulle risorse dal punto di vista della sintassi XAML, vedere Panoramica delle risorse XAML.

Accesso alle risorse dal codice

Le chiavi che identificano le risorse definite da 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 comportamentale tra questi metodi è ciò che accade se la chiave richiesta non viene trovata. FindResource genera un'eccezione. TryFindResource non genera 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 occasionali utilizzi non distringhe. La logica di ricerca per la risoluzione delle risorse del codice equivale al caso XAML di riferimento di risorse dinamiche. La ricerca di risorse inizia dall'elemento chiamante, quindi continua attraverso gli elementi padre nell'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 apportate alle risorse che si sono verificate durante il runtime.

Nell'esempio di codice seguente viene illustrato un Click gestore eventi che trova una risorsa per chiave e usa il valore restituito per impostare una proprietà.

private void myButton_Click(object sender, RoutedEventArgs e)
{
    Button button = (Button)sender;
    button.Background = (Brush)this.FindResource("RainbowBrush");
}
Private Sub myButton_Click(sender As Object, e As RoutedEventArgs)
    Dim buttonControl = DirectCast(sender, Button)
    buttonControl.Background = DirectCast(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 è 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. I dizionari risorse vengono usati per aggiungere nuove risorse alle raccolte esistenti, verificare se un determinato nome di chiave è già usato dalla raccolta e altre operazioni. Se si scrive un'applicazione WPF interamente nel codice, è anche possibile creare l'intera raccolta nel codice, assegnarvi risorse. L'insieme può quindi essere assegnato alla Resources proprietà di un elemento. Questa operazione è descritta nella sezione successiva.

È possibile indicizzare all'interno di una determinata Resources raccolta, usando una chiave specifica come indice. Le risorse a cui si accede in questo modo non seguono le normali regole di runtime della risoluzione delle risorse. Si accede solo a quella raccolta specifica. La ricerca delle risorse non attraversa l'ambito della risorsa alla radice o all'applicazione se non è stato trovato alcun oggetto valido nella 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 un dizionario risorse, vedere la ResourceDictionary classe .

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. A tale scopo, creare una nuova ResourceDictionary istanza e quindi aggiungere tutte le risorse al dizionario usando chiamate successive a ResourceDictionary.Add. Assegnare quindi l'oggetto creato ResourceDictionary 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 usata 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, varie funzionalità WPF usano deliberatamente il tipo di oggetto come chiave anziché una stringa. La funzionalità di chiave della risorsa da parte di un tipo di oggetto viene usata dallo stile WPF e dal supporto di tema. Gli stili e i temi che diventano l'impostazione predefinita per un controllo altrimenti non in stile sono ognuno con chiave dal Type del controllo a cui devono essere applicati.

La chiave per tipo fornisce un meccanismo di ricerca affidabile che funziona sulle istanze predefinite di ogni tipo di controllo. Il tipo può essere rilevato dalla reflection e utilizzato per applicare stili alle classi derivate anche se il tipo derivato in caso contrario non ha 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.

Per altre informazioni, vedere Stili, DataTemplate e chiavi implicite.

Vedi anche