Auf der Build Conference im Jahre 2017 in Seattle hat Microsoft XAML Standard angekündigt. Aktuell ist es nämlich so, dass sich die Properties und auch Controls vom Naming her zwischen UWP, WPF und auch Xamarin.Forms zum Teil stark unterscheiden. Hat man zum Beispiel bereits eine bestehende UWP-App geschrieben, kann man den verwendeten XAML Code nicht direkt in eine Xamarin.Forms-App übernehmen, sondern muss hier umständlich ein paar Anpassungen vornehmen. Deshalb versucht Microsoft nun mit XAML Standard entsprechend einen einzigen Dialekt zu entwickeln, welche für alle Apps und Anwendungen funktioniert und eine schnelle Portierung möglich macht. In diesem Beitrag möchte ich einmal den aktuellen Stand von XAML Standard in einer Xamarin.Forms App ausprobieren und schauen, ob man bestehenden Code wirklich so einfach portieren kann.

Beginnen möchte ich mit einem kurzen Video von der Build 2017, welches einen Einblick in .NET Standard und XAML Standard gibt.

Ich habe jetzt nach knapp einem Jahr mal geschaut, was eventuell mit XAML Standard und einer Xamarin.Forms App möglich ist. Aktuell benötigt man ein NuGet-Package, welche in die App eingebunden werden muss, welches XAML Standard simuliert. Das notwendige Package erhält man nicht über nuget.org, sondern muss dieses lokal als .nupkg Datei speichern und in das Projekt einbinden. Wie das genau funktioniert, habe ich bereits hier gezeigt.

Ich habe mir dann in einem kleinen Demo-Projekt einmal angeschaut, was bereits seit der Ankündigung umgesetzt wurde. Das Ergebnis ist eine Mini-App, welche Daten von RandomUser.me mit der Hilfe meines NuGet-Packages RandomUserSharp abruft und diese in einer Liste anzeigt.

Ich habe zunächst ein neues Xamarin.Forms Projekt angelegt und die NuGet-Packages aktualisiert. Danach habe ich das NuGet Package von dieser Seite heruntergeladen und entsprechend allen Projekten hinzugefügt. Nun muss dieses Package noch initialisiert werden, was durch den Aufruf von Xamarin.Forms.Alias.Alias.Init(); in den jeweiligen plattformspezifischen Klassen möglich ist. Anschließend können wir die ersten Controls in XAML Standard Syntax verwenden. Als Beispiel dient hier eine einfache Seite mit einem Titel und eine Liste. Die XAML Standard Controls lassen sich an dem Namespace alias leicht erkennen.

<alias:StackPanel>

    <!-- Title -->
    <alias:TextBlock Text="XAML Standard Demo"
                     Foreground="DarkGray"
                     HorizontalTextAlignment="Center"
                     FontSize="22" />

    <!-- Button -->
    <alias:Button Command="{Binding GetUserCommand}"
                  Text="Get User" />

    <!-- Indicator -->
    <alias:ProgressRing IsVisible="{Binding IsLoading}"
                        IsActive="{Binding IsLoading}"
                        HeightRequest="50"
                        WidthRequest="50"/>

    <!-- List -->
    <ListView ItemsSource="{Binding Users}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <alias:StackPanel Orientation="Horizontal">
                        <Image Source="{Binding PictureInfo.Large}"
                               Aspect="AspectFill"
                               HeightRequest="75"
                               WidthRequest="75" />
                        <alias:TextBlock Text="{Binding Name.First}"
                                          Foreground="Red"
                                          VerticalTextAlignment="Center"/>
                        <alias:TextBlock Text="{Binding Name.Last}"
                                         Foreground="Blue" 
                                         VerticalTextAlignment="Center"/>
                    </alias:StackPanel>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

</alias:StackPanel>

Was man sehen kann ist, dass man nun wirklich quasi seinen bestehen UWP-Code nehmen könnte und diesen direkt und Xamarin.Forms unter allen Plattformen laufen lassen könnte. Die Frage lautet nun natürlich: Gibt es ein Szenario, wo man dies gerne produktiv einsetzen möchte? So unterschiedlich sind die einzelnen XAML-Dialekte nun auch wieder nicht, dass es sich wirklich anbietet. Außerdem sind trotzdem noch Anpassungen notwendig, weil die ListView unter Xamarin.Forms zum Beispiel eine ViewCell als DataTemplate erwartet, was unter UWP nicht der Fall ist.

Trotzdem möchte ich euch die Demo nicht vorenthalten. Ihr findet diese bei mir in einem eigenen GitHub-Repository. Ich wünsche euch nun viel Spaß beim Ausprobieren und bin auf eure Meinung gespannt.

  • Matthias

    Wie von vielen Dingen, bin ich auch hier wieder von Microsoft enttäuscht. Viele großartigen Ankündigungen der letzten 2-3 Jahre sind total im Sande verlaufen – XAML Standard hätte schon viel weiter sein können, wenn man es gewollte hätte. Der Vorteil daran ist aber, dass ich mich im letzten Jahr stark von Microsoft distanziert habe und nicht mehr so abhängig bin, auch wenn ich noch(!) einige Produkte nutze.
    Allein durch die umständliche Einbindung sieht man, dass XAML Standard noch etwas weg ist. Spätestens zur BUILD würde ich – falls es nicht so ist – ein neues Visual Studio Update mit neuen Templates erwarten, welche dieses ohne namespaces nutzt.
    Andererseits scheint auch UWP keine große Fangemeinde mehr zu haben, seit Mobile weggefallen ist (wozu auch – Desktop allein kann man mit WPF/WinForms viel besser abdecken).
    Danke aber für das Update zu diesem Thema – ich hab es schon voll vergessen.

    • Sebastian Jensen

      Vielen Dank für deinen Kommentar, welchen ich so nur zustimmen kann. Auch ich war ein wenig enttäuscht, was aus dem Thema XAML Standard geworden ist. Auch für ein gutes Jahr Arbeit an dieser Thematik ist das Ergebnis nicht wirklich überzeugend. Warten wir doch jetzt aber mal die Build ab. Eventuell erfahren wir dann ja etwas neues.