Est-il possible de créer une application GUI de bureau dans .NET Core?


103

Je développe des programmes WinForms depuis quelques années. Je regarde maintenant dans .NET Core (y compris ASP.NET Core MVC). Je recherche la nouvelle technologie de bureau GUI. Dans Visual Studio 2015 mise à jour 3, je ne vois aucune option pour créer une application d'interface graphique dans .NET Core. Qu'est-ce que je rate?


Vous devriez changer l'angle en voyant cette nouvelle plate-forme. Tous les frameworks existants, WPF / WinForms / UWP / GTK # / Xamarin.Mac / iOS / Android peuvent utiliser le code que vous écrivez sur .NET Core. Cela permet le développement multiplateforme, mais pas comme vous l'imaginez.
Lex Li

Donc, vous dites que je peux créer des interfaces graphiques dans -par exemple- winforms et le code back-end dans .net core
EKanadily

non. Les packages basés sur .NET Core peuvent être ajoutés directement en tant que références.
Lex Li

1
L'électron est la voie à suivre. Utilisez asp.net derrière une API. Si vous gardez le voyant logique de l'interface utilisateur, vous devriez pouvoir conserver la partie la plus importante de l'application sur .net
user7558114

1
En tant que conseil de pro, je passerais à Visual Studio 2017 (si possible) ou utiliserais d'autres outils disponibles (la CLI et / ou VS Code / Rider) car VS 2015 n'a pas accès aux outils .NET Core 2.0, qui entraver votre développement à l'avenir. Même si vous ne faites que l'expérimenter.
Jamie Taylor

Réponses:


66

Vous ne manquiez de rien. MS n'a fourni aucun moyen raisonnable de créer des applications GUI directement à l'aide de .Net Core jusqu'à .Net Core 3, bien que UWP (Universal Windows Platform) soit partiellement construit sur .Net Core.

.Net Core 3.0 inclut la prise en charge de Winforms et WPF, bien qu'il soit uniquement Windows.

.Net 6 inclura .Net MAUI, qui prendra en charge les applications de bureau Windows et macOS et les applications mobiles, avec les applications de bureau Linux prises en charge par la communauté (et non par MS). .Net 5 comprendra une version préliminaire de .Net MAUI.

Pour les options multiplateformes tierces, consultez les autres réponses.


42
omg, c'est un choc! alors quel est l'intérêt d'un framework multiplateforme qui n'a pas d'interface graphique?
EKanadily

19
@EssamGndelee Le point principal sont les applications ASP.NET Core. Les applications console constituent un point secondaire.
svick

3
@ChristopherPainter Une meilleure prise en charge du cloud computing et attirer des développeurs de plates-formes telles que Node.js sont quelques-unes des raisons pour lesquelles .Net Core existe, oui. Mais cela ne signifie pas que Microsoft se soucie uniquement de ceux-ci maintenant.
svick

1
@CYoung Je pense que la position de Microsoft est que vous devriez utiliser UWP pour cela.
svick

1
@svick, cela éliminerait complètement toute programmation multiplateforme, ce qui était censé résoudre .NET Core. UWP est assez bon uniquement pour la famille MS: /
walther

43

AvaloniaUI prend désormais en charge l'exécution sur .NET Core sous Win / OSX / Linux. XAML, liaisons et modèles de contrôle inclus.

par exemple pour développer sur MacOs avec Rider:

  1. Suivez les instructions pour installer les nouveaux modèles Avalonia dotnet
  2. Ouvrez JetBrains Rider et depuis l'écran d'accueil,
  3. Choisissez New Solution-> (Près du haut de la liste des modèles) -> More Templates-> Bouton Install Template...-> accédez au répertoire dans lequel vous avez cloné les modèles à l'étape 1.
  4. Cliquez sur le Reloadbouton
  5. Voir! Les modèles Avalonia apparaissent maintenant dans la New Solutionliste des modèles!
  6. Choisissez un modèle Avalonia
  7. Construisez et exécutez. Voyez l'interface graphique ouverte sous vos yeux.

Étapes de l'interface graphique pour installer un nouveau modèle dotnet dans JetBrains Rider


En passant, toute personne intéressée, veuillez voter pour que Jetbrains inclue le support Avalonia dans Rider: youtrack.jetbrains.com/issue/RIDER-39247
xendi

41

Vous pouvez utiliser Electron et le câbler avec Edge.js resp. bord d'électrons . Edge.js permet à electron (node.js) d'appeler les dll .net et vice versa. De cette façon, vous pouvez écrire l'interface graphique avec HTML, CSS et JavaScript et le backend avec .net core. Electron lui-même est également multiplateforme et basé sur le navigateur Chrome.


5
Mais pourquoi l'électron? Vous pouvez également simplement ouvrir une application Web sur le port X, puis y naviguer dans le navigateur. Comprend tout ce qu'Electron peut, et plus encore, car il s'agit toujours de la dernière version du navigateur, contrairement à Electron. Si vous avez besoin d'une version de navigateur spécifique, incluez Google-Chrome dans votre distribution.
Stefan Steiger

1
@StefanSteiger Je pense que l'utilisation d'électron et l'appel de l'API directement via l'assemblage combleront le vide selon lequel l'utilisateur ne verra pas l'application comme une application Web. Et certains développeurs ne veulent pas ajouter plus de couche de communication en utilisant HTTP.
Brian Ng

Electron.Net ressemble à ceci est assez simple maintenant cross-platform-blog.com/electron.net
J. Allen

Electron.NET semble prometteur, mais je serais fatigué de l'utiliser en production car cela vous oblige à ouvrir un serveur Web non sécurisé sur votre machine de production. Là encore, tant que l'extrémité ASP.NET Core de l'application est placée derrière un serveur proxy inverse correctement configuré comme IIS ou nginx (ou similaire), vous devriez être plus en sécurité.
Jamie Taylor

l'enfer pourrait simplement utiliser l'application en tant que mvc / webapi, héberger localement sur un port aléatoire et utiliser une interface électronique appelant une api locale.
Wjdavis5

30

Il est désormais possible d'utiliser Qt / QtQuick / QML avec .NET Core, en utilisant Qml.Net .

Il est très performant (pas "pinvoke chatty"), complet et fonctionne sous Linux / OSX / Windows.

Consultez mon article de blog pour voir comment il se compare aux autres options actuellement disponibles.

PS: Je suis l'auteur.


Cela semble très prometteur, je vais l'examiner
Daniel

22

Une option serait d'utiliser Electron avec JavaScript, HTML et CSS pour l'interface utilisateur et de créer une application de console .Net Core qui hébergera automatiquement une API Web pour la logique back-end. Electron démarrera l'application console en arrière-plan qui exposera un service sur localhost: xxxx.

De cette façon, vous pouvez implémenter toute la logique back-end à l'aide de .Net pour être accessible via des requêtes HTTP à partir de JavaScript.

Jetez un œil à cet article, il explique comment créer une application de bureau multiplateforme avec Electron et .Net Core et vérifier le code sur github


17

Pour la création de l' interface utilisateur basée sur la console, vous pouvez utiliser gui.cs . Il est open-source (de Miguel, créateur de Xamarin), et fonctionne sur .Net core sur Windows, Linux et MacOs.

Il comprend les éléments suivants:

  • Boutons
  • Étiquettes
  • Saisie de texte
  • Affichage
  • Champ d'édition de l'heure
  • Boutons radio
  • Cases à cocher
  • Boîtes de dialogue
    • Boîtes à messages
  • les fenêtres
  • Les menus
  • ListViews
  • Cadres
  • ProgressBars
  • Faire défiler les vues et les barres de défilement
  • Visualiseur / éditeur hexadécimal (HexView)

Exemple de capture d'écran

Exemple de capture d'écran de sortie de gui.cs




4

tl; dr - Je ne suis pas sûr qu'il soit possible pour les développeurs .NET Core de fournir un cadre d'interface graphique multiplateforme.

J'ai envie de m'attendre à ce qu'un framework d'interface graphique multiplateforme soit intégré à l'outillage officiel (en particulier une ancienne version de l'outillage - vous mentionnez que vous exécutez la mise à jour 3 de VS 2015) pour une première version de .NET Core est un peu prématuré.

Les frameworks GUI sont vraiment assez lourds et dépendent des abstractions matérielles déjà présentes sur la machine hôte. Sous Windows, il existe généralement un gestionnaire de fenêtre unique (WM) et un environnement de bureau (DE) utilisé par la plupart des utilisateurs, mais sur les nombreuses distributions de Linux prises en charge, il existe un nombre illimité de WM et de DE possibles - la plupart des utilisateurs le seront soit utiliser X-Server ou Wayland en combinaison avec KDE, Gnome ou XFCE. Mais aucune installation Linux n'est la même.

Le fait que la communauté open source ne puisse pas vraiment se contenter d'une configuration "standard" pour une VM et DE signifie qu'il serait assez difficile pour les développeurs .NET Core de créer un framework GUI qui fonctionnerait sur toutes les plates-formes et combinaisons de DE et WM.

Beaucoup de gens ici ont d'excellentes suggestions (de l'utilisation d'ASP.NET Core pour créer une application Web et l'utilisation d'un navigateur à la liste d'un tas de frameworks multiplateformes). Si vous jetez un œil à certains des frameworks d'interface graphique multiplateformes mentionnés, vous verrez à quel point ils sont lourds.

Cependant, il y a de la lumière au bout du tunnel alors que Miguel de Icaza a montré Xamarin fonctionnant naïvement sur Linux et MacOS à .NET Conf cette année (2017, si vous lisez ceci dans le futur), donc cela vaut peut-être la peine d'essayer que quand c'est prêt.

(mais vous devrez mettre à niveau de VS 2015 à VS 2017 pour accéder aux fonctionnalités .NET Core 2.0)


aucun raisonnement pour la variété Linux. 1. Java fonctionne bien 2. Mono exécute WinForms noramlly (tu moche) Sous Linux, vous pouvez utiliser GTK sur une distribution basée sur QT et vice versa. Ce serait cool d'avoir des liaisons QT pour .net core.
Bogdan Mart

Je suis d'accord avec tout ce que vous dites. Cependant, j'estime que l'approche de Microsoft consiste à fournir IaaS (Infrastructure as a Service), SaaS (Software as a Service) et PaaS (Platform as a Service) via sa plateforme Azure pour le moment. Il serait logique que leur premier cadre, open source, multiplateforme oriente les développeurs dans cette direction en priorité. Le travail qu'Azure et d'autres sociétés telles que RHEL et Google font pour prendre en charge à la fois ASP NET Core et .NET Core est pratiquement légendaire, et il est logique que la priorité de .NET Core semble refléter cela.
Jamie Taylor


3

Vous pouvez développer une application Web avec .NET Core et MVC et l'encapsuler dans une application JavaScript universelle Windows: https://docs.microsoft.com/en-us/windows/uwp/porting/hwa-create-windows

C'est toujours une application Web, mais c'est un moyen très léger de transformer une application Web en application de bureau sans apprendre un nouveau cadre ou / et redévelopper l'interface utilisateur, et cela fonctionne très bien.

L'inconvénient est contrairement à electron ou ReactXP par exemple, le résultat est une application Windows universelle et non une application de bureau multiplateforme.


2

Oui c'est possible.

.NET Core n'a pas de composants pour l'application GUI native prête à l'emploi. Cependant, il existe un package NuGet qui s'appelle Electron.NET , selon la réponse de Gregor Biswanger.

Electron est un framework qui vous permet de créer des applications GUI natives sur Node.js. Electron.NET est un package NuGet qui vous permet d'utiliser Electron et Node.js à partir de votre code .NET Core.

La bonne nouvelle est que vous n'avez pas besoin d'apprendre JavaScript, Electron ou Node.js pour pouvoir utiliser le package NuGet. Les fichiers JS s'exécutent dans votre application, mais ils sont automatiquement générés par le processus de construction.

Tout ce que vous faites est de créer une application ASP.NET Core MVC assez standard. La seule différence est qu'au lieu de s'exécuter dans le navigateur, il s'exécute comme une application fenêtrée native. Outre quelques lignes de code spécifiques au package Electron.NET, vous n'aurez rien à apprendre au-dessus d'ASP.NET Core MVC.

Cette page fournit un tutoriel sur son utilisation. Il contient également des liens vers des exemples de référentiels de code.


2

Nécromancie.
Pour le cas particulier des applications WinForms existantes :

il existe un moyen - même si je ne sais pas si cela fonctionne bien.
Cela va comme ceci:
prenez l'implémentation WinForms de mono.
Portez-le vers .NET Core ou NetStandard.

Recompilez vos applications WinForms avec le nouveau System.Windows.Forms.
Corrigez tout ce qui pourrait être endommagé par NetCore.
Priez pour que mono implémente parfaitement les pièces dont vous avez besoin.
(si ce n'est pas le cas, vous pouvez toujours arrêter de prier et envoyer au mono-projet une pull request avec votre correctif / patch / fonctionnalité)

Voici mon dépôt CoreFX WinForms:
https://github.com/ststeiger/System.CoreFX.Forms


1

C'est une vieille question, mais oui, il est possible de développer des applications de bureau multiplateformes (GUI), pour Windows, Linux et macOS, en utilisant VSCode, .Net Core, C #, gtk3, gtksharp et Glade en tant que GUI Designer.

Voici comment .


0

Si vous utilisez .Net Core 3.0et ci-dessus, procédez comme suit et que vous êtes prêt à partir: (Je vais utiliser .NET Core CLI , mais vous pouvez également utiliser Visual Studio)

  1. md MyWinFormsApp étape facultative
  2. cd MyWinFormsApp étape facultative
  3. dotnet new sln -n MyWinFormsApp étape facultative, mais c'est une bonne idée
  4. dotnet new winforms -n MyWinFormsApp Je suis désolé, ce n'est pas facultatif
  5. dotnet sln add MyWinFormsApp faites ceci si vous avez fait l'étape 3

D'accord, vous pouvez arrêter de lire ma réponse et commencer à ajouter du code au MyWinFormsAppprojet. mais si vous souhaitez travailler avec Form Designer, continuez à lire.

  1. Ouvrez le MyWinFormsApp.csprojfichier et changez <TargetFramework>netcoreapp3.1<TargetFramework>en <TargetFrameworks>net472;netcoreapp3.1</TargetFrameworks>(si vous utilisez netcoreapp3.0ne vous inquiétez pas, changez-le en <TargetFrameworks>net472;netcoreapp3.0</TargetFrameworks>)
  2. Puis ajoutez suivant ItemGroup
  <ItemGroup Condition="'$(TargetFramework)' == 'net472'">
    <Compile Update="Form1.cs">
      <SubType>Form</SubType>
    </Compile>
    <Compile Update="Form1.Designer.cs">
      <DependentUpon>Form1.cs</DependentUpon>
    </Compile>
  </ItemGroup>

Après avoir effectué ces étapes, voici ce que vous devriez obtenir:

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFrameworks>net472;netcoreapp3.1</TargetFrameworks>
    <UseWindowsForms>true</UseWindowsForms>
  </PropertyGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'net472'">
    <Compile Update="Form1.cs">
      <SubType>Form</SubType>
    </Compile>
    <Compile Update="Form1.Designer.cs">
      <DependentUpon>Form1.cs</DependentUpon>
    </Compile>
  </ItemGroup>

</Project>
  1. Ouvrez Program.cset ajoutez le préprocesseur suivant -si
#if NETCOREAPP3_1
    Application.SetHighDpiMode(HighDpiMode.SystemAware);
#endif

Vous pouvez maintenant ouvrir un MyWinFormsAppprojet à l'aide de Visual Studio 2019 ( je pense que vous pouvez également utiliser Visual Studio 2017, mais je ne suis pas sûr ) et double-cliquez sur Form1.cset vous devriez voir ceci:

entrez la description de l'image ici

D'accord, ouvrez Toolbox ( Ctrl+W,X) et commencez à ajouter des contrôles à votre application et rendez-la jolie.

Vous pouvez en savoir plus sur Designer @ Windows Forms .NET Core Designer

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.