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:
x:Static
supportato daStaticExtension
x:Reference
supportato daReferenceExtension
x:Type
supportato daTypeExtension
x:Null
supportato daNullExtension
x:Array
supportato daArrayExtension
Queste quattro estensioni di markup XAML sono supportate da molte implementazioni di XAML, tra cui Xamarin.Forms:
StaticResource
supportato daStaticResourceExtension
DynamicResource
supportato daDynamicResourceExtension
Binding
supportato daBindingExtension
— discusso nel capitolo 16. Data bindingTemplateBinding
supportato daTemplateBindingExtension
— non coperto nel libro
Un'estensione di markup XAML aggiuntiva è inclusa in Xamarin.Forms connessione con RelativeLayout
:
ConstraintExpression
— non coperto nel libro
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:
Non confondere l'estensione x:Static
di markup e l'estensione di StaticResource
markup.
Albero di dizionari
Quando il parser XAML rileva un StaticResource
oggetto , 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
, S
L
, 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.