您的当前位置:首页>全部文章>文章详情

【C#】Winform NanUI 0.88版本 用官方源码搭建原生态开发环境

CrazyPanda发表于:2024-02-08 23:55:00浏览:494次TAG:

目录

一、需求

二、搭建原生开发环境

1.导入源码

2.解决源码报错

错误1

错误2

3.导入其他项目

4.官方Demo运行效果

三、创建自己的NanUI项目

1.新建项目

2.导入NanUI.Runtime扩展包

3.添加NanUI程序集的引用

4.MainIndex主界面相关代码

5.Program程序入口相关代码

6.读取本地前端文件的处理

四、测试项目效果

五、结束




一、需求

NanUI 插件确实很方便,但想改其中的需求怎么办,下面就来自己搭建NanUI 原生开发环境,在此很感谢作者免费的开源。

官方源码地址:GitHub - NetDimension/NanUI: NanUI is an open source .NET project for .NET / .NET Core developers who want to use front-end technologies such as HTML5 / CSS3 to build user interfaces for Windows Form applications.   

如果下载比较慢,也可以选择码云进行下载。


二、搭建原生开发环境


1.导入源码

新建一个项目,将源码的 NetDimension.NanUI 文件夹复制到你的新建的项目中。这里先导入NetDimension.NanUI,是因为其他的插件代码,依赖这个程序集,在导入其他扩展程序集之前,请确保 NetDimension.NanUI 没有错误。

点击解决方案--->添加--->现有项目,选中NetDimension.NanUI.csproj,将NetDimension.NanUI 项目导入到你的项目中

1.png

1.png


2.解决源码报错

右键生成解决方案,这时项目会报错:

1.png


错误1

我们看看报错的地方:

public static ApplicationConfigurationBuilder UseApplicationDataDirectory(
    this ApplicationConfigurationBuilder @this,  string path)
{
    @this.Use(builder =>
    {
        builder.Properties[nameof(UseApplicationDataDirectory)] = path;
        return (runtime, props) =>
        {
            if (!props.ContainsKey(nameof(UseApplicationDataDirectory)))
            {
                return;
            }
            var path = (string)props[nameof(UseApplicationDataDirectory)];
            runtime.ChromiumEnvironment.SettingConfigurations += new Action<CefSettings>(settings =>
            {
                settings.CachePath = path;
                settings.LogFile = Path.Combine(path, "debug.log");
            });
        };
    }, ExtensionExecutePosition.SubProcessStartup);
    return @this;
}

在ApplicationConfigurationBuilder方法的参数中,原本有一个参数叫 path,但在方法里面又申请了一个path的变量,将path改为paths即可。

 
public static ApplicationConfigurationBuilder UseApplicationDataDirectory(
    this ApplicationConfigurationBuilder @this,  string path)
{
    @this.Use(builder =>
    {
        builder.Properties[nameof(UseApplicationDataDirectory)] = path;
        return (runtime, props) =>
        {
            if (!props.ContainsKey(nameof(UseApplicationDataDirectory)))
            {
                return;
            }
            var paths = (string)props[nameof(UseApplicationDataDirectory)];
            runtime.ChromiumEnvironment.SettingConfigurations += new Action<CefSettings>(settings =>
            {
                settings.CachePath = paths;
                settings.LogFile = Path.Combine(paths, "debug.log");
            });
        };
    }, ExtensionExecutePosition.SubProcessStartup);
    return @this;
}


错误2

另一个错误,和上面的错误一样,在Initialize方法里,原本就有一个args参数,这里将args改为_args即可。

var context = GetAppContext();
if (context == null)
{
    context = ApplicationConfiguration.UseApplicationContext?.Invoke();
    if (context != null)
    {
        context.ThreadExit += (_, _args) =>
        {
            Application.Exit();
        };
    }
}


3.导入其他项目

将其他的几个项目一样导入进来,包括FormiumClient

1.png


4.官方Demo运行效果

将FormiumClient设为启动项目,运行:

1.png

以上都是引入官方的Demo,下面我们自己新建一个项目吧


三、创建自己的NanUI项目


1.新建项目

点击解决方案,新建项目,注意这里要用Windows窗体应用

1.png

1.png

1.png


2.导入NanUI.Runtime扩展包

下面添加NanUI的Runtime 扩展包,这个主要是给项目生成CEF包用的,

1.png


3.添加NanUI程序集的引用

1.png

将我们项目需要用到的程序集添加进来,点击确定

1.png

新建的项目结构,如下图

1.png


4.MainIndex主界面相关代码

新建类 MainIndex

using NetDimension.NanUI;
using NetDimension.NanUI.HostWindow;
using NetDimension.NanUI.JavaScript;
using System;
using System.Drawing;
 
namespace WinFormsApp2
{
 
    public class MainIndex : Formium
    {
        public override HostWindowType WindowType => HostWindowType.System;     
        //public override string StartUrl => "https://www.baidu.com/";
        public override string StartUrl => "static.app.local/index.html";
 
        #region 浏览器函数
        protected override void OnReady()
        {
            //显示控制台
            //ShowDevTools();
            //注册JS方法
            MapClrObjectToJavaScript();
        }
 
        private void MainIndex_BeforeClose(object sender, NetDimension.NanUI.Browser.FormiumCloseEventArgs e)
        {
            Console.WriteLine("[MainIndex]当浏览器关闭时");
        }
 
        private void MainIndex_LoadEnd(object sender, NetDimension.NanUI.Browser.LoadEndEventArgs e)
        {
            Console.WriteLine("[MainIndex]当网页加载完成时");
        }
        #endregion
 
        #region 注册JS方法
        private void MapClrObjectToJavaScript()
        {
            var obj = JavaScriptValue.CreateObject();
 
            //示例
            obj.SetValue("JsCallCSharp", JavaScriptValue.CreateFunction(args =>
            {
                return null;
            }));
            RegisterExternalObjectValue("CSharpProject", obj);
        }
        #endregion
 
        public MainIndex()
        {
            BeforeClose += MainIndex_BeforeClose;
            LoadEnd += MainIndex_LoadEnd;
 
            Size = new Size(1280, 800);
            StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            Title = "终端";
            CanMaximize = false;//不允许使用最大化界面按钮
            Resizable = false;//窗体是否能够改变大小
            //Mask.BackColor = Color.White;
        }
    }
}


5.Program程序入口相关代码

Program.cs 改为下面这样

using NetDimension.NanUI;
using NetDimension.NanUI.LocalFileResource;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WinFormsApp2
{
    static class Program
    {
        /// <summary>
        ///  The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            //Application.SetHighDpiMode(HighDpiMode.SystemAware);
            //Application.EnableVisualStyles();
            //Application.SetCompatibleTextRenderingDefault(false);
            //Application.Run(new Form1());
 
            WinFormium.CreateRuntimeBuilder(env =>
            {
                env.CustomCefCommandLineArguments(cmdLine =>
                {
                    // Configure command line arguments of Cef here.
                    //cmdLine.AppendSwitch("disable-gpu");
                    //cmdLine.AppendSwitch("disable-gpu-compositing");
                });
                env.CustomCefSettings(settings =>
                {
                    // Configure default Cef settings here.
                    settings.WindowlessRenderingEnabled = true;
                });
                env.CustomDefaultBrowserSettings(cefSettings =>
                {
                    // Configure default browser settings here.
                });
            },
            app =>
            {
                //读取本地资源
                app.UseLocalFileResource("http", "static.app.local", System.IO.Path.Combine(Application.StartupPath, "View"));
                app.UseMainWindow(context =>
                {
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
 
                    return new MainIndex();
                });
            })
            .Build()
            .Run();
        }
    }
}


6.读取本地前端文件的处理

新建一个View文件夹

1.png

将你的web前端代码复制进去

1.png


四、测试项目效果

运行,成功读取到了本地的html文件,那么使用NanUI源码搭建原生开发环境也就到此结束了

1.png


五、结束

如果这个帖子对你有用,欢迎给我点赞 + 留言,谢谢


原文链接Winform NanUI 0.88版本 用官方源码搭建原生态开发环境-CSDN博客

猜你喜欢

【C#】C# Winform ListView用法
目录添加标题显示网格添加数据到表格中自定义其他属性结束添加标题在 Winfrom 界面中添加一个 ListView 组件,然后点击右上角的箭头,点击编辑列添加下面标题,然后点击确定此时 ListView 中还是一片空白,不能显示这些标题,在视图这里选择 Details就会如下图所示,虽然标题出来了,内容确实一块白版,此时还是觉得 DataGridView 组件好用啊显示网格此时,表格只是一片空白,可以在属性面板中设置,显示网格,如下图&nbsp;&nbsp;这时,就如下图所示,效果就出来了,但是
发表于:2024-01-31 浏览:379 TAG:
【C#】C# Winform 定时清理日志
一、前言在 Winform 开发中经常有这样的需求,在用户执行一些操作不正确时,需要将错误信息反馈给用户,比如:登录密码不正确,无法连接到服务器等,一般常见的用法有两个:1.弹框使用&nbsp;MessageBox.Show(&quot;密码错误&quot;); 这样的方式,弹框后,用户必须点击确定后才能执行下一步操作,给用户的体验并不是特别好。2.在界面中显示错误信息,定时清除如果是输入框,直接用&nbsp;ErrorProvider 控件就行了。如果只是做一些简单的提示信息,那么就要定时清除
发表于:2024-01-31 浏览:307 TAG:
【C#】从零开始用C#写一个桌面应用程序(一)基础操作
准备winform应用程序编写桌面应用客户端的技术。xaml一种标记语言。winform程序组成。&nbsp;程序入口:&nbsp;form.cs和它的设计文件:&nbsp;&nbsp;启动的过程以及涉及的文件:main函数:&nbsp;form1的构造函数和它的设计文件:&nbsp;&nbsp;&nbsp; main-》构造form-》initializeComponent-》&nbsp;拖入一个 button控件可以看到:&nbsp;这时我们已经梳理启动过程。使用组件的方法&nbsp;可以在
发表于:2024-01-30 浏览:498 TAG:
【C#】C# Winform GDI+ 绘图
目录一、概述二、绘图1.画直线2.画矩形3.画圆、圆弧4.画扇形5.画多边形6.绘制字符串7.填充图形结束一、概述Graphics类是GDI+技术的一个基本类。GDI+(Graphics Device Interface)是.NET框架的重要组成部分,提供对二维图形图像和文字排版处理的支持。GDI+相关的类分布在下列命名空间中: System.Drawing:提供了最基本的绘图功能(比如画直线、矩形、椭圆等); System.Drawing.Drawing2D: 提供了高级的二维和矢量绘图功能(
发表于:2024-02-18 浏览:387 TAG:
【C#】Winform NanUI 0.77版本 清除Cookie等本地缓存
目录需求NanUI0.88版本的缓存路径NanUI0.77版本的缓存路径试着实现功能添加扩展出现的问题解决问题结束需求清除web前端保存的一些的数据,或者清除浏览器缓存会用到。NanUI0.88版本的缓存路径在NanUI0.88版本中,只要在Program.cs启动模块中调用app.ClearCacheFile();就可以清除浏览的缓存了。0.88版本的缓存路径:&quot;C:\\Users\\Administrator\\AppData\\Roaming\\Net Dimension Stu
发表于:2024-02-08 浏览:319 TAG:
【C#】C# NLua Winform 热更新
一、概述NLua 是一个用于 .NET 平台的 Lua 脚本绑定库。它允许在 C# 代码中嵌入 Lua 脚本,并允许两者之间进行交互。NLua 的主要特点包括:轻量级:NLua 是一个轻量级的库,易于集成到现有的 .NET 项目中。动态类型:Lua 是动态类型的语言,这意味着变量的类型可以在运行时改变。灵活的绑定:NLua 提供了灵活的绑定机制,使得 C# 和 Lua 之间的数据交互变得简单。丰富的 API:NLua 提供了丰富的 API,以便在 Lua 脚本中调用 .NET 的类和方法。调试支
发表于:2024-02-18 浏览:358 TAG:
【C#】C# Winfrom 常用功能整合-2
目录Winfrom&nbsp;启动一个外部exe文件,并传入参数Winform ListBox用法HTTP下载文件(推荐)Winform HTTP下载并显示进度Winform&nbsp;HTTP下载文件Winform&nbsp;跨线程访问UI组件Winform 改变文字的颜色和大小Winfrom&nbsp;启动一个外部exe文件,并传入参数在我们常用的一些软件中,经常有些软件,双击之后根本打不开,这是因为启动时做了限制,我们需要传入一些参数才能打开,在工作中,这个需求也可以用在软件的自动更新上,
发表于:2024-02-02 浏览:341 TAG:
【C#】C# 解压zip文件,并覆盖
&nbsp;使用ZipFile.ExtractToFile方法,并将overwrite参数设置为true,这样可以覆盖同名的目标文件。代码如下:using&nbsp;System; using&nbsp;System.IO; using&nbsp;System.IO.Compression; &nbsp; namespace&nbsp;ConsoleApplication { &nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;Program &nbsp;&nbsp;&amp;nbs
发表于:2024-01-29 浏览:591 TAG:
【C#】C# Winform 配置文件App.config
目录一、简介二、添加引用&nbsp;三、添加节点1.普通配置节点2.数据源配置节点四、管理类 ConfigHelper.cs1.获取配置节点2.更新或加入配置节点结束一、简介在C#中,配置文件很常用,ASP.NET 和 Winform 名称不同,用法一样,如下图config 文件通常用来存储一些需要修改的数据,比如用户名密码,连接数据库的IP地址等,而不是在代码中写死。有人可能会问,那我自己自定义一个配置文件也行,为什么要用它这个?区别当然有,微软自己封装的读取和写入会更简单一些,你自己封装的,
发表于:2024-01-31 浏览:385 TAG:
【C#】C#的DateTimePicker控件(日期控件)
目录一、使用DateTimePicker控件显示时间二、使用DateTimePicker控件以自定义格式显示日期三、返回DateTimePicker控件中选择的日期1.源码2.生成效果&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DateTimePicker控件(日期控件)用于选择日期和时间,DateTimePicker控件只能选择一个时间,而不是连续的时间段,也可以直接输入日期和时间。一、使用DateTimePicker控件显示时间&nbsp;
发表于:2024-01-29 浏览:391 TAG: