Usare e aggiornare le risorse dinamiche
Nell'unità precedente è stata definita una risorsa in XAML (Extensible Application Markup Language) e la si è usata come valore statico. Ci sono tuttavia alcuni casi in cui l'uso di StaticResource non è appropriato. Si considerino gli scenari seguenti:
Si supponga di voler implementare temi a colori che consentono all'utente di cambiare l'aspetto dell'app in fase di esecuzione. L'estensione di markup StaticResource esegue la ricerca nel dizionario una sola volta, quindi non può aggiornare dinamicamente l'interfaccia utente.
Si archiviano le preferenze degli utenti in un server Web e le si carica all'avvio dell'applicazione. L'estensione di markup StaticResource genera un'eccezione se la chiave non viene trovata nel dizionario.
Questa unità mostra come gestire problemi di questo tipo usando risorse dinamiche.
Come aggiornare le risorse in fase di esecuzione
Le risorse vengono archiviate in un dizionario risorse. È possibile scrivere codice per aggiornare le risorse in fase di esecuzione. È anche possibile aggiungere nuove risorse o rimuovere quelle esistenti.
Si consideri l'esempio seguente:
<ContentPage.Resources>
<Color x:Key="PanelBackgroundColor">Blue</Color>
</ContentPage.Resources>
Si supponga di voler modificare il valore della risorsa PanelBackgroundColor mentre l'applicazione è in esecuzione. È possibile aggiungere codice al file esterno di codice associato alla pagina, per accedere alla proprietà Resources. L'esempio seguente aggiorna il valore della risorsa dell'esempio XAML precedente a un colore diverso.
this.Resources["PanelBackgroundColor"] = Colors.Green;
Che cos'è DynamicResource?
DynamicResource è un’altra estensione di markup per la ricerca di risorse in un dizionario risorse. È simile a StaticResource per il fatto che esegue una ricerca nel dizionario quando l'oggetto di destinazione viene creato, ma rimane anche in ascolto delle modifiche apportate alla risorsa nel dizionario. Se il valore della risorsa nel dizionario cambia, DynamicResource aggiorna automaticamente l'interfaccia utente.
DynamicResource offre un vantaggio rispetto a StaticResource. Se DynamicResource non riesce a trovare la chiave nel dizionario, lascia la proprietà non impostata. A differenza di quanto accade con StaticResource, una chiave mancante non è un errore e non genera un'eccezione.
Nota
La natura dell'estensione di markup DynamicResource comporta una piccola riduzione delle prestazioni dell'applicazione. Sebbene sia possibile usare DynamicResource al posto di StaticResource nelle pagine XAML, se una risorsa non cambia è consigliabile farvi riferimento con l'estensione di markup StaticResource.
Per usare il colore di sfondo aggiornato dell'esempio precedente, è possibile applicare l'oggetto DynamicResource nel codice XAML in questo modo:
<ContentPage ...>
<ContentPage.Resources>
<Color x:Key="PanelBackgroundColor">Blue</Color>
</ContentPage.Resources>
<StackLayout BackgroundColor="{DynamicResource PanelBackgroundColor}">
...
</StackLayout>
</ContentPage>
Se il valore della risorsa PanelBackgroundColor cambia, il valore di BackgroundColor del controllo StackLayout viene aggiornato automaticamente.