Boîte à outils multiplateforme .NET UI version AvaloniaUI 0.9

Avalonia est une boîte à outils d'interface utilisateur .NET multiplateforme open source inspirée des technologies WPF et UWP. Il prend entièrement en charge Windows, macOS et Linux, .NET Core 2.0-3.1, XAML, les liaisons de données, les contrôles sans look et bien plus encore.



(VDPV montre le travail sans XOrg)


La version 0.9 était une grande mise à jour avec un ensemble de fonctionnalités attendues depuis longtemps: XAML compilé, prise en charge des menus globaux, la possibilité de faire défiler en douceur les listes virtualisées avec des éléments de taille arbitraire, la prise en charge des entrées tactiles et autre chose.


Je demande des détails sous chat.


XAML compilé


Dans les versions précédentes, l'analyse XAML se produisait lors de l'exécution de l'application. Cette approche présente plusieurs inconvénients:


  • lentement
  • le programme se compile sans erreur puis ne fonctionne pas (QML, je vous regarde)
  • l'analyseur utilisé a produit des erreurs inintelligibles comme "La valeur de la propriété 'Content' est nulle" lors de la saisie du nom du contrôle.

Notre nouveau compilateur analyse tout au moment de la compilation et le transmet directement à MSIL. Vous pouvez même regarder le décompilateur worldword et voir quelque chose comme ceci:


Le décompilateur, d'ailleurs, fonctionne également en Avalonia .


Pour cette raison, il s'est avéré lancer de nombreux appels à la réflexion, ce qui a rendu le lancement de l'application turbo-actif. Seul notre répertoire de contrôle après le passage au compilateur a commencé à s'exécuter 40% plus rapidement.


Lorsque les vérifications pendant la compilation n'ont pas aidé (par exemple, quelque chose s'est effondré dans le convertisseur), vous pouvez consulter les traces d'erreur normales avec une ligne dans le fichier XAML. Eh bien, en général, comme un débogueur en XAML, si vous êtes intéressé:



Menus globaux sur macOS et Linux


Sur les coquelicots de l'application, les menus à l'intérieur de la fenêtre ne sont généralement pas dessinés, car en haut de l'écran, il y a une barre de menu globale pour tout le monde. Sur un certain nombre d'environnements Linux de bureau (Unity, KDE avec la case à cocher dans les paramètres, vala-panel-appmenu), une fonctionnalité similaire est également disponible.


La prise en charge de ces menus est apparue dans Avalonia; dans le code, ils ressemblent à ceci:


<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> 

Ne soyez pas alarmé par CMD+Q ; sur un non-Mac, il sera mappé sur `Control + Q. C'est maintenant un synonyme du modificateur spécifique à la plate-forme "Command".


Pour empêcher les gens de copier-coller de la même structure dans le menu «normal» pour les plates-formes «traditionnelles», nous avons également introduit le contrôle <NativeMenuBar/> , qui peut être placé là où ce menu devrait être. Eh bien, le contrôle lui-même prendra tout avec NativeMenu et il déterminera s'il est nécessaire de le dessiner ou si le système peut le gérer.



menu de la fenêtre dans la barre globale sur makoshi


Il existe également une fonction sur macOS - l'application a un élément de menu avec le nom de l'application. Il existe généralement des éléments globaux pour l'ensemble de l'application, tels que les paramètres. Nous, pour que les utilisateurs ne soient pas surpris, nous générons ce menu par défaut:

contenu du menu d'application par défaut


Eh bien, vous devez le personnaliser dans votre App.xaml:


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

En conséquence, Application dispose désormais de son propre DataContext , dans lequel vous pouvez placer un modèle de vue. Eh bien, c'était là où se lier.


Sous Linux, en raison de son hétérogénéité générale, ahem, cette option est désactivée par défaut et peut être activée par:


 .With(new X11PlatformOptions { UseDBusMenu = true }) 

J'ai personnellement testé sur Unity et KDE sur Ubuntu 18.04, mais qui sait comment c'est dans d'autres distributions.


Implémentations de la boîte de dialogue des fichiers gérés


Si, pour une raison quelconque, vous ne souhaitez pas utiliser de boîtes de dialogue natives (par exemple, vous ne voulez pas faire glisser un GTK transparent dans le système intégré), vous pouvez maintenant utiliser celles implémentées sur Avalonia lui-même:



L'ensemble de l'API est le même, il vous suffit de l'activer dans AppBuilder:


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

Si vous souhaitez placer des boîtes de dialogue dans une fenêtre personnalisée (dessinez un cadre là-bas, par exemple, pour coloriser vos couleurs), alors cela se fait comme ceci:


 .UseManagedSystemDialogs<AppBuilder, MyCustomWindowType>(); 

ItemsRepeater


ItemsRepeater été porté depuis UWP. Ce contrôle vous permet de créer des listes virtualisées hautes performances avec des éléments de différentes tailles et un défilement fluide. La mise en page est contrôlée séparément du contrôle via le système de mises en page jointes .


À l'avenir, nous prévoyons de lui transférer tous les contrôles de liste, mais pour l'instant, vous pouvez prendre et utiliser dans vos applications où vous en avez besoin.


Importer Grid et GridSplitter depuis WPF


Nous continuons à porter des contrôles à partir de WPF maintenant-déjà-presque-bientôt-peut-être-entièrement-assez-très-open-source. De ses parties déjà ouvertes.


Cette fois, ils ont fait glisser une chose aussi fondamentale que Grid, avec tous ses SharedSizeGroups et GridSplitter. Alors maintenant, le code qui fonctionnait dans WPF fonctionnera dans Avalonia de la même manière, pas "généralement le même, mais ...".


Optimisations des performances


Beaucoup de travail a été fait sur eux. Déraciner principalement LINQ de partout et des allocations inutiles des endroits les plus inattendus. Donc, sur le Raspberry Pi, nous avons maintenant des animations donnant du FPS, pas du SPF.


KMS / DRM / GBM / libinput sur Linux


Ce qui est montré dans la vidéo devant le chat. Nous pouvons désormais utiliser la même infrastructure, sur la base de laquelle fonctionnent de nouveaux et meilleurs gestionnaires d'affichage, qui viennent progressivement remplacer Xorg. Cela nous permet de travailler sans gestionnaire d'affichage, juste au-dessus du noyau Linux et même avec une accélération matérielle via OpenGL.


Cette fonctionnalité vous donne la possibilité de créer des systèmes de kiosque qui exécutent uniquement le noyau Linux et votre application.


Prise en charge de la saisie tactile


Jusqu'à présent, il est désactivé par défaut, mais s'il existe un écran tactile, il peut être activé en ajoutant le code suivant à votre AppBuilder:


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

Si la saisie tactile antérieure était traitée comme une souris émulée par le système d'exploitation, nous passions maintenant aux événements de pointeur du modèle UWP avec un «pointeur» distinct pour chaque contact avec la surface tactile. Ils ont également introduit un support de base pour les reconnaisseurs de gestes, sur lesquels ils ont pris en charge le défilement avec un doigt.


Vidéos de printemps avec les premières démos:




Prêt pour la production


On nous demande constamment "est-il adapté à la production?", "Et quand est 1.0?". Oui, ça convient. 1.0 sera, selon le modèle SemVer , lorsque nous arrêterons de changer un peu chaque version de l'API (enfin, ou nous pouvons passer au modèle de version du navigateur et dans quelques années, il y aura «AvaloniaUI 71 release»).


Il existe actuellement plusieurs applications sur AvaloniaUI avec de grandes bases d'utilisateurs. Nous connaissons un certain nombre d'applications commerciales portées sur AvaloniaUI. Nous tenons à remercier les équipes de tous ces projets pour leur aide inestimable dans le test de cette version.


Compte tenu de cette utilisation intensive, nous passons à un nouveau modèle de prise en charge des versions. La branche 0.9 sera prise en charge par des corrections de bogues et le rétroportage des modifications critiques jusqu'à la sortie de la prochaine version.
L'an prochain également, l'assistance technique sera disponible sur une base commerciale. Ce n'est pas parce que nous sommes gourmands, c'est parce que vous ne pouvez pas aller loin sur l'enthousiasme et "dans votre temps libre après le travail", et les développeurs sont nécessaires pour le plein temps. Les conditions sont en cours d'élaboration à ce jour, que si vous êtes intéressé ou avez quelque chose d'urgence, écrivez à team@avaloniaui.net


Comment commencer à utiliser


Il existe un tutoriel assez détaillé en anglais. Pour les développeurs familiers avec WPF / UWP, tout doit être intuitif et simple, il y a une liste des différences les plus importantes.


Remerciements


Cette libération a été rendue possible grâce au travail de nombreuses personnes, en particulier grokys , jkoritzinsky , kekekeks , danwalmsley , jmacato , marchingcube , wieslawsoltes , gillibald et bien d'autres.


La meilleure façon de supporter Avalonia est de participer au développement: implémenter une fonctionnalité, corriger un bug ou aider au test. Voir la page Contribuant .

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


All Articles