Plattformübergreifende .NET UI-Toolkit-Version AvaloniaUI 0.9

Avalonia ist ein plattformübergreifendes Open-Source-Toolkit für die .NET-Benutzeroberfläche, das von WPF- und UWP-Technologien inspiriert ist. Es unterstützt Windows, MacOS und Linux, .NET Core 2.0-3.1, XAML, Datenbindungen, Lookless Controls und vieles mehr.



(VDPV zeigt Arbeit ohne XOrg)


Version 0.9 war ein großes Update mit einer Reihe lang erwarteter Funktionen: kompiliertes XAML, Unterstützung für globale Menüs, die Möglichkeit, problemlos durch virtualisierte Listen mit Elementen beliebiger Größe zu scrollen, Unterstützung für Berührungseingaben und etwas anderes.


Ich bitte um Details unter Katze.


Kompilierte XAML


In früheren Versionen trat die XAML-Analyse während der Anwendungsausführung auf. Dieser Ansatz hatte mehrere Nachteile:


  • langsam
  • das Programm kompiliert fehlerfrei und funktioniert dann nicht (QML, ich sehe dich an)
  • Der verwendete Parser erzeugte unverständliche Fehler wie "Der Wert der 'Content'-Eigenschaft ist null", wenn der Name des Steuerelements eingegeben wurde.

Unser neuer Compiler analysiert alles zur Kompilierungszeit und übergibt es direkt an MSIL. Sie können sich sogar den Worldword Decompiler ansehen und so etwas sehen:


Der Decompiler arbeitet übrigens auch in Avalonia .


Aufgrund dessen stellte sich heraus, dass viele Aufrufe zum Nachdenken führten, wodurch der Start der Anwendung turboaktiv wurde. Erst unser Steuerverzeichnis nach dem Wechsel zum Compiler lief 40% schneller.


Wenn die Prüfungen während der Kompilierung nicht geholfen haben (z. B. ist etwas im Konverter auseinandergefallen), können Sie die normalen Fehlerspuren mit einer Zeile in der XAML-Datei anzeigen. Im Allgemeinen wie ein Debugger in XAML:



Globale Menüs unter macOS und Linux


Auf Mohnblumen der Anwendung werden die Menüs im Fenster normalerweise nicht gezeichnet, da oben auf dem Bildschirm eine globale Menüleiste für alle Benutzer vorhanden ist. Auf einer Reihe von Desktop-Linux-Umgebungen (Unity, KDE mit dem Kontrollkästchen in den Einstellungen, Vala-Panel-App-Menü) ist eine ähnliche Funktion ebenfalls verfügbar.


Die Unterstützung für solche Menüs ist in Avalonia erschienen und sieht im Code ungefähr so ​​aus:


<Window> <NativeMenu.Menu> <NativeMenu> <NativeMenuItem Header="File"> <NativeMenuItem.Menu> <NativeMenu> <NativeMenuItem Header="Open" Command="{Binding OpenCommand}"/> <NativeMenuItemSeperator/> <NativeMenuItem Header="Recent"> <NativeMenuItem.Menu> <NativeMenu/> </NativeMenuItem.Menu> </NativeMenuItem> <NativeMenuItemSeperator/> <NativeMenuItem Header="Quit Avalonia" Command="{Binding CloseCommand}" Gesture="CMD+Q"/> </NativeMenu> </NativeMenuItem.Menu> </NativeMenuItem> <NativeMenuItem Header="Edit"> <NativeMenuItem.Menu> <NativeMenu> <NativeMenuItem Header="Copy"/> <NativeMenuItem Header="Paste"/> </NativeMenu> </NativeMenuItem.Menu> </NativeMenuItem> </NativeMenu> </NativeMenu.Menu> </Window> 

Lassen Sie sich von CMD+Q nicht beunruhigen, denn auf einem Nicht-Mac wird die Zuordnung zu "Control + Q" vorgenommen. Es ist nun ein solches Synonym für den plattformspezifischen Modifikator "Command".


Um zu verhindern, dass <NativeMenuBar/> die gleiche Struktur in das „normale“ Menü für „traditionelle“ Plattformen kopieren und einfügen, haben wir auch das <NativeMenuBar/> eingeführt, das dort platziert werden kann, wo sich dieses Menü befinden sollte. Nun, die Steuerung selbst übernimmt alles mit NativeMenu und stellt fest, ob es notwendig ist, es zu zeichnen, oder ob das System damit fertig wird.



Fenstermenü in der globalen Leiste von Makoshi


Auch unter macOS gibt es eine Funktion: Die Anwendung verfügt über einen Menüpunkt mit dem Namen der Anwendung. Es gibt normalerweise Elemente, die für die gesamte Anwendung global sind, z. B. Einstellungen. Damit die Benutzer nicht überrascht sind, generieren wir standardmäßig dieses Menü:

Standardinhalt des Anwendungsmenüs


Nun, Sie müssen es in Ihrer App.xaml anpassen:


 <Application> <NativeMenu.Menu> <NativeMenu> <NativeMenuItem Header="About MyApp" Command="{Binding AboutCommand}" /> </NativeMenu> </NativeMenu.Menu> </Application> 

Dementsprechend verfügt Application nun über einen eigenen DataContext , in den Sie ein Ansichtsmodell einfügen können. Nun, das war wo man bindet.


Unter Linux ist diese Option aufgrund ihrer allgemeinen Heterogenität standardmäßig deaktiviert und kann aktiviert werden durch:


 .With(new X11PlatformOptions { UseDBusMenu = true }) 

Ich persönlich habe Unity und KDE unter Ubuntu 18.04 getestet, aber wer weiß, wie es in anderen Distributionen ist.


Implementierungen von Dialogfeldern für verwaltete Dateien


Wenn Sie aus irgendeinem Grund keine nativen Dialogfelder verwenden möchten (z. B. keine nahtlose GTK in das eingebettete System ziehen möchten), können Sie jetzt die in Avalonia selbst implementierten Dialogfelder verwenden:



Die gesamte API ist dieselbe, Sie müssen sie nur in AppBuilder aktivieren:


 AppBuilder.Configure<App>() .UsePlatformDetect() .UseManagedSystemDialogs(); 

Wenn Sie Dialoge in ein benutzerdefiniertes Fenster einfügen möchten (dort beispielsweise einen Rahmen zeichnen, um Ihre Farben einzufärben), geschieht dies folgendermaßen:


 .UseManagedSystemDialogs<AppBuilder, MyCustomWindowType>(); 

ItemsRepeater


ItemsRepeater von UWP portiert. Mit diesem Steuerelement können Sie leistungsstarke virtualisierte Listen mit Elementen unterschiedlicher Größe und reibungslosem Bildlauf erstellen. Das Layout wird separat von der Steuerung über das System für angehängte Layouts gesteuert.


In Zukunft planen wir, alle Listensteuerelemente darauf zu übertragen, aber Sie können sie vorerst in Ihren Anwendungen verwenden, wo Sie sie benötigen.


Importieren Sie Grid und GridSplitter aus WPF


Wir fahren fort, Kontrollen von jetzt-schon-fast-bald-können-ganz-ziemlich-sehr-Open-Source-WPF zu portieren. Aus seinen bereits offenen Teilen.


Diesmal zogen sie eine so grundlegende Sache wie Grid zusammen mit all ihren SharedSizeGroups und GridSplitter. Der Code, der in WPF funktioniert hat, funktioniert jetzt in Avalonia auf die gleiche Weise, nicht "im Allgemeinen gleich, aber ...".


Leistungsoptimierungen


Es wurde viel Arbeit an ihnen geleistet. Hauptsächlich LINQ von überall und unnötige Zuweisungen von den unerwartetsten Orten aus. Auf dem Raspberry Pi gibt es nun Animationen, die FPS und nicht SPF ausgeben.


KMS / DRM / GBM / libinput unter Linux


Was ist in dem Video vor der Katze gezeigt. Wir können jetzt dieselbe Infrastruktur nutzen, auf deren Grundlage neue, bessere Display-Manager arbeiten, die nach und nach Xorg ersetzen. Dadurch können wir ohne Display Manager arbeiten, direkt über dem Linux-Kernel und sogar mit Hardwarebeschleunigung über OpenGL.


Mit dieser Funktion können Sie Kiosksysteme erstellen, auf denen nur der Linux-Kernel und Ihre Anwendung ausgeführt werden.


Touch-Eingabe-Unterstützung


Bisher ist es standardmäßig deaktiviert. Wenn jedoch ein Touchscreen vorhanden ist, kann dieser durch Hinzufügen des folgenden Codes zu Ihrem AppBuilder aktiviert werden:


 .With(new X11PlatformOptions { EnableMultiTouch = true }) .With(new Win32PlatformOptions { EnableMultitouch = true }) 

Wenn eine frühere Berührungseingabe vom Betriebssystem als eine Maus emuliert wurde, haben wir jetzt zu den Zeigerereignissen des UWP-Modells mit einem separaten „Zeiger“ für jeden Kontakt mit der Berührungsoberfläche gewechselt. Sie führten auch grundlegende Unterstützung für Gestenerkenner ein, auf denen sie das Scrollen mit dem Finger unterstützten.


Frühlingsvideos mit den ersten Demos:




Produktion bereit


Wir werden ständig gefragt: "Ist es für die Produktion geeignet?", "Und wann ist 1.0?". Ja, es ist passend. 1.0 wird laut dem SemVer- Modell sein, wenn wir aufhören, jede Version ein wenig auf die API umzustellen (oder wir können auf das Browserversionierungsmodell umsteigen und in ein paar Jahren wird es die „AvaloniaUI 71-Version“ geben).


Derzeit gibt es auf AvaloniaUI mehrere Anwendungen mit einer großen Benutzerbasis. Uns ist eine Reihe kommerzieller Anwendungen bekannt, die auf AvaloniaUI portiert sind. Wir möchten den Teams all dieser Projekte für ihre unschätzbare Hilfe beim Testen dieser Version danken.


Angesichts dieser starken Beanspruchung wechseln wir zu einem neuen Release-Support-Modell. Branch 0.9 wird bis zur Veröffentlichung der nächsten Version durch Fehlerkorrekturen und Backporting kritischer Änderungen unterstützt.
Auch im nächsten Jahr wird der technische Support auf kommerzieller Basis verfügbar sein. Das liegt nicht daran, dass wir gierig sind, sondern daran, dass Sie nicht weit genug mit Begeisterung und "in Ihrer Freizeit nach der Arbeit" kommen können und Entwickler für Vollzeitstellen benötigt werden. Bisher werden Bedingungen ausgearbeitet, bei Interesse oder Dringlichkeit schreiben Sie bitte an team@avaloniaui.net


Wie fange ich an?


Es gibt ein ziemlich detailliertes Tutorial auf Englisch. Für Entwickler, die mit WPF / UWP vertraut sind, sollte alles intuitiv und einfach sein. Es gibt eine Liste der wichtigsten Unterschiede.


Danksagung


Möglich wurde diese Veröffentlichung durch die Arbeit vieler Menschen, insbesondere von grokys , jkoritzinsky , kekekeks , danwalmsley , jmacato , marchingcube , wieslawsoltes , gillibald und vielen anderen.


Die beste Möglichkeit, Avalonia zu unterstützen, besteht in der Teilnahme an der Entwicklung: Implementierung einer Funktion, Behebung eines Fehlers oder Hilfe beim Testen. Siehe die Contributing- Seite.

Source: https://habr.com/ru/post/de481102/


All Articles