Freigeben über


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:

Diese vier XAML-Markuperweiterungen werden von vielen Implementierungen von XAML unterstützt, z. B. Xamarin.Forms:

Eine zusätzliche XAML-Markuperweiterung ist in Xamarin.Forms in Verbindung mit RelativeLayout enthalten:

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:

Dreifacher Screenshot der gemeinsamen Nutzung von Ressourcen

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.