Xamarin.Forms im Praxiseinsatz: Unterschiede zwischen Xamarin.Forms XAML und Microsoft XAML

9. März 2015

Nach der Einführung in Xamarin.Forms im vorherigen Artikel stehen in diesem und den folgenden Artikeln technische Details im Vordergrund. Den Anfang macht XAML.

Xamarin.Forms bietet neben der UI-Generierung durch C# Code auch XAML-Unterstützung an. Seit der Version 1.3 mit  der Einführung zahlreicher XAML-Features (Styles, Triggers, etc.) macht die XAML-Verwendung in einem Xamarin.Forms Projekt erstmalig Sinn. Dieser Artikel zeigt die Gemeinsamkeiten und Unterschiede zwischen Xamarin.Forms XAML und Microsoft XAML auf.

Toolunterstützung

Sowohl WPF-Entwickler als auch Windows Store App-Entwickler befinden sich in der komfortablen Situation, dass ihnen mehrere Tools zum Designen der XAML-Views zur Verfügung stehen: der XAML-Designer in Visual Studio als auch Blend. Für die XAML-Entwicklung mit Xamarin.Forms gibt es (noch) keinen Designer.

Standardmäßig bietet Visual Studio auch keine IntelliSense Unterstützung für Xamarin.Forms XAML an, im Xamarin Studio steht es jedoch zur Verfügung. Für Visual Studio gibt es aber die Möglichkeit die IntelliSense Unterstützung für Xamarin.Forms XAML nachzurüsten: entweder durch Verwendung von ReSharper 9 von JetBrains oder durch die kostenlose Xamarin.Forms Intellisense Extension.

Gemeinsame Sprachfeatures

Prinzipiell orientiert sich Xamarin.Forms  XAML an den Konzepten von Microsoft XAML. Die folgende Liste zeigt eine Auswahl von gemeinsamen Features:

Unterschiedliche Bezeichnungen für Controls

Da Xamarin.Forms eine plattformübergreifende Abstraktionsebene gegenüber den nativen Controls darstellt, verwendet Xamarin.Forms eigene Begriffe dafür:

Xamarin.Forms Windows Store App
StackLayout StackPanel
Label TextBlock
Entry TextBox

Eine Übersicht über alle von Xamarin.Forms angebotenen Controls findet man hier.

Unterschiede im Layout: Padding statt Margin

Xamarin.Forms Controls bieten keine Margin Property, um einen äußeren Rand zu definieren. Stattdessen kapselt man das Control in ein ContentView-Element und setzt von diesem die Padding Property entsprechend. Dadurch “simuliert” man einen äußeren Rand um das gekapselte Control. Durch die Nutzung des zusätzlichen Controls wird allerdings die Performance negativ beeinflusst.
Abhilfe kann aber auch schon die Nutzung der Spacing Property eines Containers (z. B. StackLayout) schaffen. Es definiert den Abstand von enthaltenen Kind-Elementen untereinander. Ein Grid Control bietet hier im speziellen für die Abstände zwischen Zeilen und Spalten die Properties RowSpacing und ColumnSpacing. Mehr Details dazu sowie Codebeispiele findet man hier.

Fehlende Features

Xamarin.Forms XAML bietet zwar Unterstützung für Data Templates an, es fehlt jedoch ein DataTemplateSelector. Oren Novotny hat hierfür eine einfache Lösung implementiert, welche wir auch in dem aktuellen Xamarin.Forms Projekt eingesetzt haben.

Ähnlich verhält es sich beim Data Binding mit Listen von Elementen. Xamarin.Forms bietet zwar das ListView-Control an, in manchen Situationen ist jedoch ein generischeres Control notwendig. Hierfür bietet sich der RepaterView aus dem Xamarin Forms Labs Open Source Project an.

Fazit

Im Vergleich zu den XAML-Features von Windows Store Apps oder gar WPF befindet sich das Xamarin.Forms XAML noch in den Kinderschuhen. Wenn man aber bedenkt, dass die API noch nicht einmal ein Jahr alt ist und es schon mehrere wichtige Releases gab, kann man davon ausgehen, dass immer mehr XAML-Features umgesetzt werden. Außerdem stellt Xamarin.Forms die einzige Möglichkeit dar unter Wiederverwendung seines vorhanden C# und XAML Knowhows native Apps für die Android und iOS Plattform zu entwickeln.