Zusammenfassung von Kapitel 10. XAML-Markuperweiterungen
Hinweis
Dieses Buch wurde im Frühjahr 2016 veröffentlicht und seitdem nicht aktualisiert. Wenngleich ein großer Teil des Buchs weiterhin relevante Informationen liefert, sind einige Abschnitte veraltet, und einige Themen sind nicht mehr korrekt oder vollständig.
Normalerweise konvertiert der XAML-Parser alle als Attributwert festgelegten Zeichenfolgen in den Typ der Eigenschaft, basierend auf Standardkonversionen für die grundlegenden .NET-Datentypen, oder eine TypeConverter
-Ableitung, die an die Eigenschaft angefügt ist, oder deren Typ mit einem TypeConverterAttribute
.
Manchmal ist es jedoch praktisch, ein Attribut aus einer anderen Quelle festzulegen, z. B. einem Element in einem Wörterbuch, dem Wert einer statischen Eigenschaft oder eines statischen Felds oder aus einer Berechnung.
Dies ist die Aufgabe einer XAML-Markuperweiterung. Trotz des Namens sind XAML-Markuperweiterungen keine Erweiterung von XML. XAML ist immer gültiger XML-Code.
Die Codeinfrastruktur
Ein XAML-Markuperweiterung ist eine Klasse, die die IMarkupExtension
-Schnittstelle implementiert. Bei einer solchen Klasse tritt häufig das Wort Extension
am Ende ihres Namens auf, doch normalerweise kommt es in XAML ohne dieses Suffix vor.
Die folgenden XAML-Markuperweiterungen werden von allen Implementierungen von XAML unterstützt:
x:Static
unterstützt vonStaticExtension
.x:Reference
unterstützt vonReferenceExtension
.x:Type
unterstützt vonTypeExtension
.x:Null
unterstützt vonNullExtension
.x:Array
unterstützt vonArrayExtension
.
Diese vier XAML-Markuperweiterungen werden von vielen Implementierungen von XAML unterstützt, z. B. Xamarin.Forms:
StaticResource
unterstützt vonStaticResourceExtension
.DynamicResource
unterstützt vonDynamicResourceExtension
.Binding
unterstützt vonBindingExtension
— erörtert in Kapitel 16. DatenbindungTemplateBinding
unterstützt vonTemplateBindingExtension
— nicht im Buch behandelt
Eine zusätzliche XAML-Markuperweiterung ist in Xamarin.Forms in Verbindung mit RelativeLayout
enthalten:
ConstraintExpression
— nicht im Buch behandelt
Zugreifen auf statische Member
Verwenden Sie das x:Static
-Element, um ein Attribut auf den Wert einer/s öffentlichen, statischen Eigenschaft, Felds oder Enumerationsmembers festzulegen. Legen Sie die Eigenschaft Member
auf den statischen Member fest. Normalerweise ist es einfacher, x:Static
und den Membernamen in geschweiften Klammern anzugeben. Der Name der Member
-Eigenschaft muss nicht eingeschlossen werden, nur der Member selbst. Diese gängige Syntax wird im SharedStatics-Beispiel gezeigt. Die statischen Felder selbst werden in der AppConstants
-Klasse definiert. Diese Methode gestattet es Ihnen, von einem Programm verwendete Konstanten einzurichten.
Mit einer zusätzlichen XML-Namespacedeklaration können Sie auf öffentliche, statische Eigenschaften, Felder oder Enumerationsmember im .NET Framework verweisen, wie im SystemStatics-Beispiel veranschaulicht.
Ressourcenverzeichnisse
Die VisualElement
-Klasse definiert eine Eigenschaft namens Resources
, die Sie auf ein Objekt vom Typ ResourceDictionary
festlegen können. Innerhalb von XAML können Sie Elemente in diesem Verzeichnis speichern und sie mit dem x:Key
-Attribut identifizieren. Die im Ressourcenverzeichnis gespeicherten Elemente werden von allen Verweisen auf das Element gemeinsam genutzt.
StaticResource für die meisten Zwecke
In den meisten Fällen verwenden Sie die StaticResource
-Markuperweiterung, um auf ein Element aus dem Ressourcenverzeichnis zu verweisen, wie im ResourceSharing-Beispiel gezeigt. Sie können ein StaticResourceExtension
-Element oder StaticResource
in geschweiften Klammern verwenden:
Verwechseln Sie die x:Static
-Markuperweiterung nicht mit der StaticResource
-Markuperweiterung.
Struktur von Datenwörterbüchern
Wenn der XAML-Parser eine StaticResource
findet, beginnt er damit, die visuelle Struktur aufwärts nach einem übereinstimmenden Schlüssel zu durchsuchen, und schlägt dann im ResourceDictionary
in der App
-Klasse der Anwendung nach. Hierdurch können Elemente, die sich in einem Ressourcenverzeichnis tiefer in der visuellen Struktur befinden, eine Ressource überschreiben, die sich weiter oben in der visuellen Struktur befindet. Dies wird im ResourceTrees-Beispiel demonstriert.
DynamicResource für spezielle Zwecke
Die StaticResource
-Markuperweiterung veranlasst das Abrufen eines Elements aus dem Verzeichnis, wenn eine visuelle Struktur während des InitializeComponent
-Aufrufs erstellt wird. Eine Alternative zu StaticResource
ist DynamicResource
, das eine Verknüpfung mit dem Verzeichnisschlüssel bewahrt und das Ziel aktualisiert, wenn das von dem Schlüssel referenzierte Element sich ändert.
Der Unterschied zwischen StaticResource
und DynamicResource
wird im DynamicVsStatic-Beispiel veranschaulicht.
Eine von DynamicResource
festgelegte Eigenschaft muss, wie in Kapitel 11, „Die bindbare Infrastruktur“, besprochen, von einer bindbaren Eigenschaft unterstützt werden.
Seltener verwendete Markuperweiterungen
Verwenden Sie die x:Null
-Markuperweiterung, um eine Eigenschaft auf null
festzulegen.
Verwenden Sie die x:Type
-Markuperweiterung, um eine Eigenschaft auf ein Type
-Objekt von .NET festzulegen.
Verwenden Sie x:Array
, um ein Array zu definieren. Geben Sie den Typ der Arraymember an, indem Sie die Eigenschaft [Type
] auf eine x:Type
-Markuperweiterung festlegen.
Eine benutzerdefinierte Markuperweiterung
Sie können Ihre eigene XAML-Markuperweiterung erstellen, indem Sie eine Klasse schreiben, die die IMarkupExtension
-Schnittstelle mit einer ProvideValue
-Methode implementiert.
Die HslColorExtension
-Klasse erfüllt diese Anforderung. Sie erstellt einen Wert vom Typ Color
, basierend auf Werten der Eigenschaften namens H
, S
, L
und A
. Diese Klasse ist das erste Element in einer Xamarin.Forms-Bibliothek mit dem Namen Xamarin.FormsBook.Toolkit, die im Verlauf dieses Buchs erstellt und verwendet wird.
Das CustomExtensionDemo-Beispiel veranschaulicht, wie Sie auf diese Bibliothek verweisen und die benutzerdefinierte Markuperweiterung verwenden.