XAML Standard ausprobiert

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.

Lokalisierung einer Xamarin.Forms App mit dem Xamarin Community Toolkit Alexa-SkillRequest verifizieren Pokédex – Kleines Xamarin.Forms Projekt – Teil 1