GPXviewer 2 – Mit Avalonia UI auf mehrere Plattformen

Es gibt eine lange Liste möglicher Frontend-Fameworks, zwischen denen .NET-Entwicklungsteams wählen können. Ein sehr spannender Kandidat ist Avalonia UI [1]. Ursprünglich als Cross-Plattform Alternative zu WPF gestartet, bietet es heute neben den bekannten Desktops von Windows, macOS und Linux auch Unterstützung für mobile Plattformen (Android, iOS), für den Browser (via WebAssembly) und als Alleinstellungsmerkmal auch für Embedded Linux. Für mein OpenSource Tool GPXviewer war für mich neben Windows insbesondere macOS relevant. Ganz einfach aus dem Grund, weil ich mittlerweile mehr Zeit auf meinem MacBook verbringe, als auf meinem Windows Laptop [2]. Daher habe ich mich entschieden, GPXviewer von WPF nach Avalonia UI zu portieren – daraus entstand dann das Projekt GPXviewer 2 [3]. In diesem und nachfolgenden Artikeln möchte ich einige Erfahrungen teilen, die ich damit sammeln durfte.

Screenshot

GPXviewer 2
Screenshot von GPXviewer 2 unter macOS

Avalonia UI und JetBrains Rider sind ein hervorragendes Paar

Zunächst noch etwas Allgemeines. Es gibt Stand heute meines Wissens drei relevante IDEs, mit denen man Avalonia UI Applikationen entwickeln kann. Visual Studio, Visual Studio Code und Rider. Alle drei verfügen jeweils über Extensions für Avalonia UI. Ersteres läuft nur auf Windows, darum klammere ich es hier aus. Visual Studio Code kann ein guter Einstieg sein, ich persönlich bin damit aber in Bezug auf C# Entwicklung noch nie warm geworden. Visual Studio Code bietet eine Extension für Avalonia UI, welche vom Avalonia UI Team selbst bereitgestellt wird [4]. Tatsächlich empfiehlt das Team hinter Avalonia UI aber JetBrains Rider, etwa unter [5]. Warum tun sie das? Unterm Strich ist es relativ einfach. Ich kann mich an die Aussage aus einem Community Q&A erinnern, dass die Integration von Avalonia UI in Rider schlicht deswegen besser ist, weil JetBrains diese selbst gebaut hat. JetBrains hat als IDE Hersteller deutlich mehr Erfahrung darin, eine hervorragende Developer Experience bereitzustellen. Ich selbst kann das mit meinen bisherigen Erfahrungen bestätigen. Die Entwicklung von Applikationen mit Avalonia UI funktioniert in Rider wunderbar. Für mich noch viel spannender als die Features der jeweiligen Avalonia UI Extensions ist aber die Tatsache, dass direkt auf den Plattformen entwickelt werden kann, auf denen später die Applikation läuft. Rider unterstützt Windows, macOS und Linux.

Besonderheiten wegen macOS

Zurück zu GPXviewer 2. Die Portierung selbst ging relativ schnell von der Hand. Nicht zuletzt auch deswegen, weil Mapsui [6] neben dem WPF Control auch ein Control für Avalonia mitbringt. Mapsui verwendete ich als Maps Komponente bereits unter WPF. Gleiches gilt für die Charts Komponente LiveCharts2 [7], die ebenfalls eine Unterstützung für Avalonia liefert. Der Rest ließ sich ebenfalls relativ einfach portieren. Hier möchte ich aber noch auf wenige Unterschiede eingehen, die durch die Unterstützung von macOS beachtet werden müssen. Der erste Punkt ist, dass macOS am oberen Bildschirmrand die Hauptmenü-Leiste der aktuell ausgewählten Applikation anzeigt. Es ist somit nicht notwendig, eine solche Leiste direkt im eigenen Fenster darzustellen. Ein anderer Punkt ist die Tatsache, dass Desktop Applikation in macOS standardmäßig nur mit einer Instanz ausgeführt werden. Startet man eine Applikation erneut, wird schlicht die bereits laufende Instanz aktiviert. Auf die technischen Details dieser Dinge möchte ich hier in diesem Artikel noch nicht eingehen – das sind dann eher Themen für Folgeartikel. Für diesen Artikel wollte ich lediglich darauf hinweisen, dass es auch Unterschiede zwischen den Betriebssystemen gibt, die nicht direkt mit dem UI Framework zu tun haben.

Pakete für macOS und Windows

Ein weiterer Unterschied zwischen den Plattformen ist noch die Art, wie Installationspakete gebaut werden. Für Windows und macOS war es tatsächlich relativ einfach. Für Windows reicht ein sog. Windows Application Packaging Project. Darüber lässt sich ein Paket erstellen, das man sogar über den Windows Store veröffentlichen könnte. Für macOS ist etwas mehr Arbeit notwendig, die Dokumentation von Avalonia UI hat dazu aber ein sehr gutes How-To [8]. Ein nicht zu unterschätzender Punkt ist, dass diese Wege nicht auf jeder Plattform funktionieren. Das Windows Application Packaging Projekt ist ein Feature von Visual Studio und kann daher nur unter Windows gebaut werden. Die Applikation für macOS zu verpacken erfordert wiederum das Setzen der Ausführungsrechte am Executable – was unter dem Windows Dateisystem nicht funktioniert.

Wie geht es weiter?

Es gibt noch viele weitere Themen, über die ich in diesem Kontext schreiben könnte. Zudem ist GPXviewer 2 auch noch nicht fertig. Es gibt noch eine Liste an Features, die ich noch nachrüsten möchte und werde. Aus meiner Sicht ist es aber Stand jetzt schon ein gutes Beispiel für eine Applikation mit Avalonia UI für mehrere Plattformen. Ich nutze das Projekt regelmäßig, um Features von Avalonia UI auszuprobieren und Anderen zu zeigen. Gibt es Dinge, die dich dabei speziell interessieren? Hinterlasse gerne einen Kommentar oder schreibe mir eine E-Mail. Weitere Artikel werden sicher folgen.

Verweise

  1. Website von Avalonia UI
    https://avaloniaui.net/
  2. Als .NET Entwickler auf dem MacBook Pro
    https://www.rolandk.de/wp-posts/2024/05/als-net-entwickler-auf-dem-macbook-pro/
  3. GitHub Projekt zu GPXviewer 2
    https://github.com/RolandKoenig/GpxViewer2
  4. Visual Studio Code Extension für Avalonia UI
    https://github.com/AvaloniaUI/AvaloniaVSCode
  5. Post zu JetBrains Rider vom Avalonia UI Team auf LinkeIn
    https://www.linkedin.com/posts/avaloniaui_jetbrains-rider-the-only-cross-platform-activity-7285304434639671296-20xy?utm_source=share&utm_medium=member_desktop
  6. GitHub Projekt zu Mapsui – Eine Maps Komponente für viele gängige UI Frameworks in .NET
    https://github.com/Mapsui/Mapsui
  7. LiveChart 2 – Chart Bibliothek für viele gängige UI Frameworks in .NET
    https://livecharts.dev/
  8. Avalonia UI Applikationen für macOS verpacken
    https://docs.avaloniaui.net/docs/deployment/macOS

Ebenfalls interessant

  1. Als .NET Entwickler auf dem MacBook Pro
    https://www.rolandk.de/wp-posts/2024/05/als-net-entwickler-auf-dem-macbook-pro/
  2. Cross-Plattform GUI mit C# und Avalonia UI
    https://www.rolandk.de/wp-posts/2020/07/cross-platform-gui-mit-c-und-avalonia/

Schreibe einen Kommentar

Diese Seite verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden..