Zusammenfassung von Kapitel 8. Verknüpfung von Code und XAML

Beispiel herunterladen Das Beispiel herunterladen

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.

In diesem Kapitel wird XAML ausführlicher behandelt, insbesondere wie Code und XAML miteinander interagieren.

Übergeben von Argumenten

Im Allgemeinen muss eine Klasse, die in XAML instanziiert wird, über einen öffentlichen parameterlosen Konstruktor verfügen. Das resultierende Objekt wird durch Eigenschaftseinstellungen initialisiert. Es gibt jedoch zwei weitere Möglichkeiten, wie Objekte instanziiert und initialisiert werden können.

Obwohl es sich hierbei um allgemeine Methoden handelt, werden sie größtenteils in Verbindung mit MVVM-Ansichtsmodellen verwendet.

Konstruktoren mit Argumenten

Das ParameteredConstructorDemo-Beispiel veranschaulicht, wie das x:Arguments-Tag verwendet wird, um Konstruktorargumente anzugeben. Diese Argumente müssen durch Elementtags begrenzt werden, die den Typ des Arguments angeben. Für die grundlegenden .NET-Datentypen sind folgende Tags verfügbar:

  • x:Object
  • x:Boolean
  • x:Byte
  • x:Int16
  • x:Int32
  • x:Int64
  • x:Single
  • x:Double
  • x:Decimal
  • x:Char
  • x:String
  • x:TimeSpan
  • x:Array
  • x:DateTime

Kann ich Methoden aus XAML aufrufen?

Das FactoryMethodDemo-Beispiel veranschaulicht, wie das x:FactoryMethod-Element verwendet wird, um eine Factorymethode anzugeben, die aufgerufen wird, um ein Objekt zu erstellen. Eine solche Factorymethode muss öffentlich und statisch sein, und sie muss ein Objekt des Typs erstellen, in dem sie definiert ist. (Beispielsweise ist die Color.FromRgb-Methode qualifiziert, weil sie öffentlich und statisch ist und einen Wert vom Typ Color zurückgibt.) Die Argumente für die Factorymethode werden innerhalb von x:Arguments-Tags angegeben.

Das x:Name-Attribut

Das x:Name-Attribut ermöglicht die Vergabe eines Namens an ein in XAML instanziiertes Objekt. Die Regeln für diese Namen sind dieselben wie für Variablennamen in C#. Im Anschluss an die Rückgabe des InitializeComponent-Aufrufs in den Konstruktor kann die CodeBehind-Datei auf diese Namen verweisen, um auf das entsprechende XAML-Element zuzugreifen. Die Namen werden vom XAML-Parser tatsächlich in private Felder in der generierten partiellen Klasse konvertiert.

Das XamlClock-Beispiel veranschaulicht die Verwendung von x:Name, damit die CodeBehind-Datei zwei in XAML definierte Label-Elemente mit dem aktuellen Datum und der aktuellen Uhrzeit aktualisiert.

Derselbe Name kann nicht für mehrere Elemente auf derselben Seite verwendet werden. Dies ist ein besonderes Problem, wenn Sie OnPlatform zum Erstellen paralleler benannter Objekte für jede Plattform verwenden. Das PlatformSpecificLabele-Beispiel veranschaulicht eine bessere Möglichkeit, etwas Ähnliches zu tun.

Benutzerdefinierte, XAML-basierte Ansichten

Es gibt verschiedene Möglichkeiten, um die Wiederholung von Markup in XAML zu vermeiden. Eine gängige Methode ist das Erstellen einer neuen XAML-basierten Klasse, die von ContentView abgeleitet wird. Dieses Verfahren wird im ColorViewList-Beispiel veranschaulicht. Die ColorView-Klasse wird von ContentView abgeleitet, um eine bestimmte Farbe und ihren Namen anzuzeigen, während die ColorViewListPage-Klasse wie gewohnt von ContentPage abgeleitet wird und explizit 17 Instanzen von ColorView erstellt.

Der Zugriff auf die ColorView-Klasse in XAML erfordert eine andere XML-Namespacedeklaration, die für Klassen in derselben Assembly gängigerweise local heißt.

Ereignisse und Handler

Ereignisse können Ereignishandlern in XAML zugewiesen werden, aber der Ereignishandler selbst muss in der CodeBehind-Datei implementiert werden. Das XamlKeypad-Beispiel veranschaulicht, wie eine Bildschirmtastatur-Benutzeroberfläche in XAML erstellt wird und wie die Clicked-Handler in der CodeBehind-Datei implementiert werden.

Tippgesten

Jedes View-Objekt kann Toucheingaben abrufen und Ereignisse aus dieser Eingabe generieren. Die View-Klasse definiert eine GestureRecognizers-Sammlungseigenschaft, die eine oder mehrere Instanzen von Klassen enthalten kann, die von GestureRecognizer abgeleitet werden.

TapGestureRecognizer generiert Tapped-Ereignisse. Das MonkeyTap-Programm veranschaulicht, wie TapGestureRecognizer-Objekte an vier BoxView-Elemente angefügt werden, um ein Imitationsspiel zu erstellen:

Triple Screenshot von Monkey Tap

Aber das MonkeyTap-Programm benötigt wirklich Sound. (Siehe im nächsten Kapitel.)