带有.NET Core 3和Electron.NET的多平台桌面HTML编辑器

目录

介绍

先决条件

应用程序编码

1.创建ASP.NET MVC应用程序

2.将ElectronNET.API NuGet程序包添加到项目中

3.在应用程序中实例化ElectronNET.API

4.将自定义菜单添加到应用程序

5.在您的应用程序中添加JavaScript HTML编辑器

6.在主线程和渲染线程之间建立通信

7.使用文件操作对象

8.生成.NET Core 3 / Electron.NET应用程序

当前问题

结论


介绍

借助.NET Core 3C#开发人员现在可以开发出真正的多平台GUI应用程序。您可以在最近发行的书中找到有关这些解决方案的研究:

Electron.NET是本书介绍的解决方案之一,它提供了所有基于同一.NET Core 3项目为WindowsLinuxMac OS X编写GUI应用程序的方法。Electron.NET是围绕着著名的Electron框架(基于NodeJS)的.NET Core包装器。

为了说明该工具的用法,我将开发一个HTML编辑器应用程序。该原型程序说明了Electron.NET在跨平台桌面应用程序中使用JavaScript组件的能力。

在我们的例子中,CKeditor用于实现编辑器本身。

Electron.NET应用程序是从ASP.NET MVC Web应用程序构建的,因此通过使用.NET CoreElectron包装器,扩展了桌面应用程序的特定功能:Electron.NET

先决条件

在使用Electron.NET 检查HTMLEditor应用程序的开发之前,您必须安装适当的开发环境。

因此,您应该已经在计算机上安装了:

  • NodeJS
  • NPM
  • 适用于dotnet CLIElectron.NET全局工具(请参阅GitHub网站)

检查该项目的GitHub网站: https://github.com/ElectronNET/Electron.NET.

HtmlEditor应用程序使用Electron.NET5.30.1版本。

请注意,您必须仔细检查是否使用了适当的.NET Core版本,Electron.NET的当前版本是针对.NET Core 3.0的(如果使用3.1版的.NET Core,它将无法正常工作……甚至没有安装)。

应用程序编码

应用程序的开发可以描述为一个简单的过程。

1.创建ASP.NET MVC应用程序

首先,您必须使用以下命令创建一个标准的.NET Core 3 ASP.NET MVC应用程序,但是您可以使用Visual Studio进行创建。

dotnet new mvc -o Multiplatform.HtmlEditor

2.ElectronNET.API NuGet程序包添加到项目中

要添加NuGet依赖项,可以使用Visual Studio 的熟悉的NuGet package Manager

您还必须安装CLI工具。
要添加所需的dotnet CLI Electron.NET全局工具:

dotnet tool install ElectronNET.CLI -g --version 5.30.1

3.在应用程序中实例化ElectronNET.API

这是通过在MVC应用程序中添加Electron包装器的实例来完成的。实际上,在startup.cs文件中:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment()) {
        app.UseDeveloperExceptionPage();
    } else {
        app.UseExceptionHandler("/Home/Error");
    }
    app.UseStaticFiles();

    app.UseRouting();

    app.UseEndpoints(endpoints => {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });

    // Open the Electron-Window here
    //Task.Run(async () => await Electron.WindowManager.CreateWindowAsync());
    if (HybridSupport.IsElectronActive) {
        ElectronBootstrap();
    }
}

public async void ElectronBootstrap()
{
    var browserWindow = await Electron.WindowManager.CreateWindowAsync
                        (new BrowserWindowOptions {
        Width = 1000,
        Height = 800,
        Show = false,
    });

    browserWindow.OnReadyToShow += () => browserWindow.Show();
    browserWindow.SetTitle("HTMLEditor 2020");
}

该应用程序现在在桌面容器中运行,但未集成任何功能:

除了在应用程序中添加Electron之外,还从不必要的代码(页面,日志记录,配置)中清除了默认的ASP.NET MVC应用程序。

4.将自定义菜单添加到应用程序

当应用程序作为桌面应用程序运行后,您必须修改默认的本地菜单。为此,应用程序的本地菜单是通过专用的MVC ControllerMenusController.cs实现的

>
public class MenusController : Controller
{
    public IActionResult Index()
    {
        if (HybridSupport.IsElectronActive) {
            var menu = new MenuItem[] {
                new MenuItem {
                    Label = "File", Submenu = new MenuItem[] {
                        new MenuItem {
                            Label = "Open HTML",
                            Accelerator = "CmdOrCtrl+O",
                            Click = async ()  =>
                            {
                                // Open file HTML
                                var mainWindow = Electron.WindowManager.BrowserWindows.First();
                                var options = new OpenDialogOptions
                                {
                                    Title = "Open HTML file",
                                    Filters = new FileFilter[]
                                    {
                                        new FileFilter { Name = "HTML", 
                                          Extensions = new string[] {"html","htm" } }
                                    }
                                };

                                var result = await Electron.Dialog.ShowOpenDialogAsync
                                             (mainWindow, options);

                                if (result.First() != "")
                                {
                                    string OpenfilePath = result.First();
                                    string strContent = FileOperation.openRead(OpenfilePath);

                                    //Call Render JS
                                    var mainWindow1 = 
                                        Electron.WindowManager.BrowserWindows.First();
                                    Electron.IpcMain.Send
                                        (mainWindow1,"setContent",strContent);

                                    mainWindow.SetTitle(OpenfilePath);
                                }
                            }
                        },
                        new MenuItem { Label = "Save HTML",
                                       Accelerator = "CmdOrCtrl+S",
                                       Click = async () =>
                        {
                            var mainWindow = Electron.WindowManager.BrowserWindows.First();

                            Electron.IpcMain.Send(mainWindow,"saveContent");
                        }
                                     },
                        new MenuItem { Type = MenuType.separator },
                        new MenuItem {
                            Label = "Exit",
                            Accelerator = "CmdOrCtrl+X",
                            Click = () =>
                            {
                                // Exit app
                                Electron.App.Exit();
                            }
                        },
                    }
                },
                new MenuItem {
                    Label = "Help", Submenu = new MenuItem[] {
                        new MenuItem
                        {
                            Label = "About",
                            Accelerator = "CmdOrCtrl+R",
                            Click = async () =>
                            {
                                // open native  message  windows
                                var options = new MessageBoxOptions
                                      ("This is a demo application for Electron.NEt 
                                        and .NET CORE 3.");
                                options.Type = MessageBoxType.info;
                                options.Title = "About HTMLEditor";

                                await Electron.Dialog.ShowMessageBoxAsync(options);
                            }
                        }
                    }
                }
            };
            Electron.Menu.SetApplicationMenu(menu);
        }
        return View();
    }
}

请注意,菜单控制器可用于调用(同步或异步)应用程序的多个功能。

5.在您的应用程序中添加JavaScript HTML编辑器

HTML编辑器本身是一个免费的JavaScript组件:CKeditor4该网站允许您通过生成config.js文件来个性化编辑器的菜单。该文件可从ckeditor4网站直接下载: https://github.com/ckeditor/ckeditor4

专用网站允许您使用专用图形界面配置编辑器。您可以在https://ckeditor.com/cke4/builder在线找到该应用程序。

创建适当的配置文件后,必须将其添加到MVC项目中(在客户端)。

实现编辑器所需的组件(jscssimg)必须添加到项目中。这是用于将ckeditor4 HTML编辑器添加到项目中的客户端依赖项的文件树状结构。

6.在主线程和渲染线程之间建立通信

有两个功能需要C#(主进程)和Html / JsRender进程)之间的通信。

  • 打开文件
  • 保存存档

这是实现这两个功能所需的两个过程之间的通信模式:

打开文件

保存存档

7.使用文件操作对象

编辑器集成了基本文件的操作:打开,保存。为这些操作实现了一个专用类:FileOperations.cs。该static对象集成了示例所需的两种匹配方法。

一旦成功完成了每个步骤(并测试了这些步骤),应用程序就完成了,至此,您必须构建项目,并且对于要生成的可执行文件的类型可能有些棘手。

8.生成.NET Core 3 / Electron.NET应用程序

对于本文的第一个版本,公开了最明显的(实际上是基本的)可执行文件部署类型。

这部分在ElectronNET GitHub网站上有很好的记录。

  • 首先,您必须使用以下命令为ASP.NET MVC应用程序创建Electron配置文件:
electronize init
  • 之后,您可以使用以下命令执行应用程序:
electronize start

此命令将完成构建以及项目的还原,第一次执行可能会花费一些时间(必须加载Electron包装器)。

当前问题

  • 我尚未设法更新应用程序的图标(正在使用该图标)
  • Mac OS X的菜单栏中,菜单显示Electron而不是File

结论

对于想要开发多平台桌面应用程序(适用于WindowsLinuxMacOS X)的ASP.NET开发人员,Electron.NET的使用似乎是一种选择的解决方案。Electron.NET使之成为可能。

通过将Web应用程序封装到桌面应用程序中,可以将许多JavaScript组件重复使用或回收用于桌面开发,这是这种方法的强项。有很多JavaScript组件可以很好地添加到桌面应用程序中(用于导航,GUI效果……)。

但是,Electron.NET的使用并未针对Windows平台进行优化,并且.NET Core包装器中没有原始项目的许多方法。此外,Elentron.NET要求您比实际的ASP.NET C#知识更精通JavaScript编程。

但是Electron.NET是一个很好的包装器,如果您想从网站开发中生成桌面应用程序,可以使用它。

如果Electron.NET不符合您的期望,那么还有许多其他解决方案可以使用C.NET Core 3编写多平台GUI桌面应用程序,请在此处查阅启发本文的书。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值