Creare e usare le risorse a livello di applicazione
La definizione di stili e risorse in una pagina Extensible Application Markup Language (XAML) è un'ottima soluzione per limitare la presenza di codice ripetuto. C'è però un problema. Le risorse e gli stili definiti sono disponibili solo nella pagina XAML specifica. I dizionari risorse a livello di pagina non sono sufficienti per poter evitare il codice ripetuto in un'applicazione quando si hanno più pagine. In questa unità viene illustrato come condividere risorse e stili fra tutte le pagine dell'applicazione .NET Multi-platform App UI (MAUI).
Dove si trovano i dizionari risorse
La classe VisualElement definisce la proprietà Resources. I controlli, le pagine e i layout ereditano da VisualElement, quindi hanno tutti una proprietà Resources che può contenere un dizionario risorse.
Anche la classe Application definisce una proprietà Resources. Application non eredita da VisualElement, quindi la proprietà viene definita come parte di questa classe.
L'illustrazione seguente mostra la struttura di un'applicazione tipica. Ogni elemento illustrato ha una proprietà Resources che può contenere un dizionario risorse.
Nota
Questo diagramma mostra una rappresentazione molto semplificata dell'organizzazione degli elementi in un'applicazione. In questo diagramma il termine View fa riferimento a un controllo singleton come Button o Label, che non funge da contenitore per alcun controllo figlio. Inoltre, il termine Layout implica un contenitore responsabile dell'organizzazione del layout dei controlli figlio. Un layout può essere annidato. Ad esempio, un controllo Grid può essere inserito in un controllo StackLayout.
Come definire le risorse e gli stili a livello di applicazione
Le risorse e gli stili a livello di applicazione vengono definiti nel file XAML associato alla classe Application. Il codice seguente mostra come dichiarare una risorsa Color nel dizionario risorse dell'applicazione.
<Application.Resources>
<Color x:Key="MyTextColor">Blue</Color>
</Application.Resources>
Come .NET MAUI individua una risorsa o uno stile
Si supponga di applicare una risorsa a uno dei controlli come illustrato nel codice seguente.
<Label TextColor="{StaticResource MyTextColor}" ... />
.NET MAUI deve individuare la definizione di tale risorsa per poter applicare il valore. Una singola applicazione può avere molti dizionari. In quali dizionari cercherà .NET MAUI e in quale ordine? Per rispondere a queste domande, è utile raffigurarsi le istanze di VisualElement nelle pagine nella forma di una struttura ad albero. L'applicazione corrisponde alla radice, mentre sotto si estendono i rami che rappresentano le pagine, i layout e le visualizzazioni. Questa struttura viene spesso chiamata struttura ad albero visuale. Ogni elemento dell'albero può avere un proprio dizionario che può contenere risorse. L'algoritmo di ricerca degli stili in .NET MAUI percorre la struttura ad albero visuale:
Iniziare la ricerca con il dizionario nell'istanza di VisualElement a cui è applicata la risorsa. Nell'esempio precedente, la ricerca inizia con il tipo Label. Se non è presente un dizionario risorse oppure è presente un dizionario ma non la risorsa, la ricerca prosegue.
Passare all'elemento padre del controllo e ripetere la ricerca. In genere la posizione successiva in cui eseguire la ricerca è un layout.
Controllare l'elemento padre del layout. In genere la posizione successiva in cui eseguire la ricerca è la pagina, anche se nel caso in cui un layout sia annidato all'interno di un altro layout (ad esempio un controllo Grid all'interno di un controllo StackLayout), la ricerca si sposterà verso l'alto nella struttura fino al layout padre.
Cercare nel dizionario la classe Application.
La ricerca restituisce il primo elemento trovato con un valore x:Key corrispondente. L'immagine seguente presenta un riepilogo della sequenza di ricerca della risorsa.
Nella pratica, la maggior parte degli sviluppatori ignora la proprietà Resources nelle visualizzazioni e nei layout. Usano i dizionari a livello di pagina per gli elementi usati in una singola pagina. Le risorse e gli stili che vogliono condividere tra più pagine vengono definiti a livello di applicazione. Il processo di ricerca deve quindi controllare solo due dizionari, rispettivamente nell'istanza della pagina corrente e nell'applicazione.
Nota
Se non viene trovata una risorsa con la chiave specificata, l'app userà i valori predefiniti per l'applicazione dello stile.
Chiavi duplicate
Ogni istanza di ResourceDictionary è indipendente, quindi lo stesso valore di x:Key può essere usato in più dizionari. La presenza dello stesso valore dell'identificatore x:Key in più dizionari nel percorso di ricerca non genera un errore. Viene usata la risorsa associata al primo valore di x:Key corrispondente nel percorso.
Si supponga ad esempio che nella classe Application sia definita la risorsa seguente:
<Application.Resources>
<x:String x:Key="msg">Two</x:String>
</Application.Resources>
Si definisce quindi la risorsa seguente in ContentPage e la si applica a un elemento Label nella stessa pagina:
<ContentPage.Resources>
<x:String x:Key="msg">One</x:String>
</ContentPage.Resources>
...
<Label Text="{StaticResource msg}">
Poiché viene usato il primo valore di x:Key corrispondente, la proprietà Text è impostata su One.