Zum Inhalt
Kuonen.UI

Ein Paket für alle Plattformen

Ein Paket für alle Plattformen: eine App-Klasse, der Host wird beim Start gewählt.

Mit dem Paket Kuonen.UI.App schreibt eine Anwendung nur eine App-Klasse und ihre Seiten. Den Einstieg je Plattform (Main, Activity, AppDelegate) schreibt der KXAML-Generator beim Bauen, und beim Start wählt Kuonen.UI den passenden Host: Windows, Linux (Wayland oder X11), macOS, Android, iOS oder den Browser. Auf jeder Plattform werden dieselben Dateien eingebunden.

Einbinden

dotnet new console -n Kasse
cd Kasse
dotnet add package Kuonen.UI.App

Program.cs wird nicht gebraucht und kann gelöscht werden. Kern, Controls, Themes, Hosts und der KXAML-Generator kommen als Abhängigkeiten mit; die .kxaml-Dateien des Projekts werden automatisch übersetzt.

Die App-Klasse

using Kuonen.UI.App;
using Kuonen.UI.Controls;

namespace Kasse;

public sealed class App : KuonenAnwendung
{
    public override Window ErzeugeHauptfenster() =>
        new() { Title = "Kasse", Width = 480, Height = 320, Content = new Hauptseite() };
}

Mehr braucht es nicht: dotnet run öffnet das Fenster auf dem Host der Plattform. KuonenAnwendung bietet dazu:

MitgliedZweck
ErzeugeHauptfenster()das erste Fenster (muss überschrieben werden)
BeimStart(IKuonenHost host)vor dem Hauptfenster, auf dem Thread der Oberfläche, etwa um Dienste anzumelden
Fehler(Exception ausnahme)eine unbehandelte Ausnahme der Oberfläche; true, wenn die Anwendung weiterläuft
BrowserElementim Browser die id des Elements, in dem die Anwendung läuft (Vorgabe app)

Zur Laufzeit nennt KuonenApp.Host den gewählten Host (Windows, Linux, MacOS, Browser, Android, IOS oder Headless).

Welcher Host gewählt wird

PlattformHostStart
WindowsWindowsHostMain vom Generator
LinuxLinuxHost (Wayland, sonst X11)Main vom Generator
macOSMacHostMain vom Generator
Browser (WebAssembly)BrowserHostMain vom Generator, die Seite läuft weiter
AndroidAndroidHostActivity vom Generator
iOS und iPadOSIosHostMain, AppDelegate und Szene vom Generator

Die Umgebungsvariable KUONEN_UI_HOST=headless startet die Anwendung ohne Fenster (Tests, Server, CI). Andere Werte übergeht sie; es entscheidet die Erkennung. Unter Linux wählt KUONEN_UI_BACKEND=wayland oder KUONEN_UI_BACKEND=x11 das Fenstersystem.

Nur der nötige Host im Paket

Ohne RuntimeIdentifier enthält die Anwendung alle Desktop-Hosts und wählt beim Start. Mit einer RuntimeIdentifier (win-x64, linux-x64, osx-arm64, browser-wasm …) schaltet das Paket die Hosts der anderen Plattformen ab; Trimmen und Native AOT entfernen sie samt ihrem Code:

dotnet publish -c Release -r win-x64 -p:PublishAot=true

Android und iOS

Dasselbe Projekt baut auch für die Telefone, wenn die Workloads da sind (dotnet workload install android ios). Dazu die Zielplattformen und die Angaben der App ergänzen:

<PropertyGroup>
  <TargetFrameworks>net10.0;net10.0-android;net10.0-ios</TargetFrameworks>
  <SupportedOSPlatformVersion Condition="'$(TargetFramework)' == 'net10.0-android'">26</SupportedOSPlatformVersion>
  <SupportedOSPlatformVersion Condition="'$(TargetFramework)' == 'net10.0-ios'">15.0</SupportedOSPlatformVersion>
  <ApplicationId>org.beispiel.kasse</ApplicationId>
  <ApplicationTitle>Kasse</ApplicationTitle>
  <ApplicationVersion>1</ApplicationVersion>
  <ApplicationDisplayVersion>1.0.0</ApplicationDisplayVersion>
</PropertyGroup>

Für iOS gehört eine Info.plist ins Projekt, deren Szenenkonfiguration den Delegaten SceneDelegate nennt (UIApplicationSceneManifest, UISceneDelegateClassName); der Generator registriert ihn unter diesem Namen. Ein vollständiges Beispiel liegt unter samples/Kuonen.UI.Beispiel.App.

Den Einstieg selbst schreiben

Wer Main, eine eigene Start-Activity (MainLauncher = true) oder einen eigenen AppDelegate schreibt, bekommt keinen generierten Einstieg. Ganz abschalten lässt er sich mit:

<PropertyGroup>
  <KuonenUIEinstieg>false</KuonenUIEinstieg>
</PropertyGroup>

Der eigene Start ruft dann KuonenApp.Starte(new App()) oder ohne App-Klasse KuonenApp.Starte(() => new Window { … }).

Meldungen des Generators:

MeldungBedeutung
KX0900mehrere App-Klassen: der Einstieg entsteht nur für genau eine
KX0901die App-Klasse braucht einen öffentlichen Konstruktor ohne Parameter

Im Designer ausprobieren

Im Designer (siehe docs/designer.md) lässt sich oben in der Vorschau die Umgebung umstellen: Windows, Linux (GNOME oder KDE), macOS, Android, iOS oder Browser. Die Seite erscheint dann mit der Designsprache, der Systemschrift, der sicheren Zone und der Bildschirmtastatur dieser Umgebung, Telefone in ihrer typischen Grösse. So zeigt sich ohne Gerät, wie sie auf jeder Plattform aussieht und reagiert.