Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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:Staticsupportato daStaticExtensionx:Referencesupportato daReferenceExtensionx:Typesupportato daTypeExtensionx:Nullsupportato daNullExtensionx:Arraysupportato daArrayExtension
Queste quattro estensioni di markup XAML sono supportate da molte implementazioni di XAML, tra cui Xamarin.Forms:
StaticResourcesupportato daStaticResourceExtensionDynamicResourcesupportato daDynamicResourceExtensionBindingsupportato daBindingExtension— discusso nel capitolo 16. Data bindingTemplateBindingsupportato 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 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.
