Condividi tramite


Riepilogo del capitolo 10. Estensioni di markup XAML

Nota

Questo libro è stato pubblicato nella primavera del 2016, e non è stato aggiornato da allora. C'è molto nel libro che rimane prezioso, ma alcuni materiali sono obsoleti, e alcuni argomenti non sono più completamente corretti o completi.

In genere, il parser XAML converte qualsiasi set di stringhe come valore di attributo nel tipo della proprietà in base alle conversioni standard per i tipi di dati .NET di base o un TypeConverter derivato associato alla proprietà o al relativo tipo con un oggetto TypeConverterAttribute.

Tuttavia, a volte è utile impostare un attributo da un'origine diversa, ad esempio un elemento in un dizionario o il valore di una proprietà o di un campo statico o da un calcolo di un certo tipo.

Questo è il processo di un'estensione di markup XAML. Nonostante il nome, le estensioni di markup XAML non sono un'estensione per XML. XAML è sempre XML legale.

Infrastruttura del codice

Un'estensione di markup XAML è una classe che implementa l'interfaccia IMarkupExtension . Una classe di questo tipo ha spesso la parola Extension alla fine del nome, ma in genere viene visualizzata in XAML senza tale suffisso.

Le estensioni di markup XAML seguenti sono supportate da tutte le implementazioni di XAML:

Queste quattro estensioni di markup XAML sono supportate da molte implementazioni di XAML, tra cui Xamarin.Forms:

Un'estensione di markup XAML aggiuntiva è inclusa in Xamarin.Forms connessione con RelativeLayout:

Accesso ai membri statici

Utilizzare l'elemento x:Static per impostare un attributo sul valore di una proprietà statica pubblica, di un campo o di un membro di enumerazione. Impostare la Member proprietà sul membro statico. In genere è più semplice specificare x:Static e il nome del membro tra parentesi graffe. Il nome della Member proprietà non deve essere incluso, ma solo il membro stesso. Questa sintassi comune è illustrata nell'esempio SharedStatics . I campi statici stessi sono definiti nella AppConstants classe . Questa tecnica consente di stabilire costanti usate tramite un programma.

Con una dichiarazione di spazio dei nomi XML aggiuntiva, è possibile fare riferimento a proprietà, campi o membri di enumerazione statici pubblici definiti in .NET Framework, come illustrato nell'esempio SystemStatics .

Dizionari risorse

La VisualElement classe definisce una proprietà denominata Resources che è possibile impostare su un oggetto di tipo ResourceDictionary. In XAML puoi archiviare gli elementi in questo dizionario e identificarli con l'attributo x:Key . Gli elementi archiviati nel dizionario risorse vengono condivisi tra tutti i riferimenti all'elemento.

StaticResource per la maggior parte degli scopi

Nella maggior parte dei casi si userà l'estensione StaticResource di markup per fare riferimento a un elemento dal dizionario risorse, come illustrato dall'esempio ResourceSharing . È possibile usare un StaticResourceExtension elemento o StaticResource tra parentesi graffe:

Screenshot triplo della condivisione delle risorse

Non confondere l'estensione x:Static di markup e l'estensione di StaticResource markup.

Albero di dizionari

Quando il parser XAML rileva un StaticResourceoggetto , inizia a cercare nella struttura ad albero visuale una chiave corrispondente e quindi cerca nella ResourceDictionary classe dell'applicazione App . In questo modo, gli elementi in un dizionario risorse sono più approfonditi nell'albero visuale per eseguire l'override di un dizionario risorse superiore nella struttura ad albero visuale. Questo è illustrato nell'esempio ResourceTrees .

DynamicResource per scopi speciali

L'estensione StaticResource di markup fa sì che un elemento venga recuperato dal dizionario quando viene compilata una struttura ad albero visuale durante la InitializeComponent chiamata. Un'alternativa a StaticResource è DynamicResource, che mantiene un collegamento alla chiave del dizionario e aggiorna la destinazione quando l'elemento a cui fa riferimento la chiave cambia.

La differenza tra StaticResource e DynamicResource è illustrata nell'esempio DynamicVsStatic .

Una proprietà impostata da DynamicResource deve essere supportata da una proprietà associabile come descritto nel capitolo 11, Infrastruttura associabile.

Estensioni di markup meno usate

Usare l'estensione x:Null di markup per impostare una proprietà su null.

Usare l'estensione x:Type di markup per impostare una proprietà su un oggetto .NET Type .

Usare x:Array per definire una matrice. Specificare il tipo dei membri della matrice impostando la proprietà [Type] su un'estensione x:Type di markup.

Estensione di markup personalizzata

Puoi creare estensioni di markup XAML personalizzate scrivendo una classe che implementa l'interfaccia IMarkupExtension con un ProvideValue metodo .

La HslColorExtension classe soddisfa tali requisiti. Crea un valore di tipo Color in base ai valori delle proprietà denominate H, SL, e A. Questa classe è il primo elemento di una Xamarin.Forms libreria denominata Xamarin.FormsBook.Toolkit che viene creata e usata nel corso di questo libro.

L'esempio CustomExtensionDemo illustra come fare riferimento a questa libreria e usare l'estensione di markup personalizzata.