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

【C#】Winform NanUI 0.88版本 JS和C#相互调用

CrazyPanda发表于:2024-02-06 20:35:55浏览:380次TAG:

目录

一、需求

版本

二、实例

JS调用C#注册的只读属性

JS调用C#注册的字段

JS调用C#注册的同步方法

JS调用C#注册的异步方法

C#注册一个方法,JS调用并传递参数

C#注册一个方法,JS调用并接收C#返回值

C#注册一个方法,接收JS的数组参数

C#注册一个方法,接收JS的一个函数,执行这个JS函数,并将C#的值传递过去

三、结束


一、需求

在软件的界面和软件逻辑分离后,最重要的就是要处理参数的传递,和函数的调用,因此存在JS中和C#相互调用的需求。

版本

NanUI 版本:0.8.80.191


二、实例

using NetDimension.NanUI;
using NetDimension.NanUI.HostWindow;
using NetDimension.NanUI.JavaScript;
using System;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace NanUI_0._88
{
    public class MainIndex : Formium
    {
        public override HostWindowType WindowType => HostWindowType.System;
 
        public override string StartUrl => @"C:\Users\Administrator\Desktop\View\index.html";
 
 
        protected override void OnReady()
        {
            Console.WriteLine("===============OnReady");
 
            //显示浏览器控制台
            ShowDevTools();
            //注册方法到JS
            MapClrObjectToJavaScript();
        }
 
 
        //当浏览器加载完成调用
        private void MainIndex_LoadEnd(object sender, NetDimension.NanUI.Browser.LoadEndEventArgs e)
        {
            Console.WriteLine("===============当浏览器加载完成调用");
           
            //执行JS代码
            ExecuteJavaScript("console.log('Hello NanUI')");
            //执行一个有返回值的JS方法
            InvokeIfRequired(async () =>
            {
                var result = await EvaluateJavaScriptAsync("(function(){ return '5';})()");
                if (result.Success)
                {
                    Console.WriteLine("===============返回值:" + result.ResultValue?.GetString());
                }
            });
        }
    
 
        //当浏览器关闭时
        private void MainIndex_BeforeClose(object sender, NetDimension.NanUI.Browser.FormiumCloseEventArgs e)
        {
            Console.WriteLine("===============当浏览器关闭时");
        }
 
        private void MapClrObjectToJavaScript()
        {
            var obj = JavaScriptValue.CreateObject();
 
            //注册只读属性
            obj.SetValue("now", JavaScriptValue.CreateProperty
                (
                    () => { return JavaScriptValue.CreateDateTime(DateTime.Now); }
                )
            );
 
            //注册值
            obj.SetValue("version", JavaScriptValue.CreateString
                (
                    Assembly.GetExecutingAssembly().GetName().Version?.ToString()
                )
            );
 
            //注册可读写属性
            obj.SetValue("subtitle", JavaScriptValue.CreateProperty
                (
                    () => JavaScriptValue.CreateString(Subtitle), title => Subtitle = title.GetString()
                )
            );
 
            //注册同步方法
            obj.SetValue("messagebox", JavaScriptValue.CreateFunction(args =>
            {
                var msg = args.FirstOrDefault(x => x.IsString);
                var text = msg?.GetString();
                InvokeIfRequired(() =>
                {
                    MessageBox.Show(HostWindow, text, "Message from JS", MessageBoxButtons.OK, MessageBoxIcon.Information);
                });
                return JavaScriptValue.CreateString(text);
            }));
 
            //注册异步方法
            obj.SetValue("asyncmethod", JavaScriptValue.CreateFunction((args, callback) =>
            {
                Task.Run(async () =>
                {
                    var rnd = new Random(DateTime.Now.Millisecond);
                    var rndValue = rnd.Next(1000, 2000);
                    await Task.Delay(rndValue);
                    var obj = JavaScriptValue.CreateObject();
                    obj.SetValue("delayed", JavaScriptValue.CreateNumber(rndValue));
                    obj.SetValue("message", JavaScriptValue.CreateString($"Delayed {rndValue} milliseconds"));
                    callback.Success(obj);
                });
            }));
 
            //接收JS的一个参数
            obj.SetValue("JsCallCSharp", JavaScriptValue.CreateFunction(args =>
                {
                    var res = args.FirstOrDefault(x => x.IsString);
                    MessageBox.Show(res.GetString());
                    return null;
                }
            ));
 
            //向JS返回一个字符串
            obj.SetValue("sayHi", JavaScriptValue.CreateFunction(args =>
                {
                    return JavaScriptValue.CreateString("fuck you!");
                }
            ));
 
            //接收来自JS的一个数组
            obj.SetValue("getArr", JavaScriptValue.CreateFunction(args =>
                {
                    var arr = args.FirstOrDefault(x => x.IsArray);
                    if (arr != null)
                    {
                        int len = arr.ArrayLength;
                        for (int i = 0; i < len; i++)
                        {
                            int v = arr.GetValue(i).GetInt();
                            Console.WriteLine("=============数组:" + v);
                        }
                    }
                    return null;
                }
            ));
 
            //接收JS的一个函数
            obj.SetValue("CallBack", JavaScriptValue.CreateFunction(args =>
               {
                   var res = args.FirstOrDefault(x => x.IsFunction);
                   if (res != null)
                   {
                       res.ExecuteFunctionAsync(GetMainFrame(),
                           new JavaScriptValue[] { JavaScriptValue.CreateString("Hello from C#") });
                   }
                   return null;
               }
            ));
 
            //对象注册到 JavaScript 环境的Formium.external里,并取名CSharpProject
            RegisterExternalObjectValue("CSharpProject", obj);
        }
 
        public MainIndex()
        {
            //当浏览器关闭时触发
            BeforeClose += MainIndex_BeforeClose;
            //当浏览器加载完成后调用
            LoadEnd += MainIndex_LoadEnd;
 
            Size = new Size(1280, 720);
            StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            Mask.BackColor = Color.White;
            Title = "NanUI 0.88版本";
            Icon = System.Drawing.Icon.ExtractAssociatedIcon("xxxx.exe");
            CanMaximize = false;//不允许使用最大化界面按钮
            Resizable = false;//窗体是否能够改变大小
        }
    }
}

上面这些方法可以在NanUI控制台执行JS


JS调用C#注册的只读属性

C#:

//注册只读属性
obj.SetValue("now", JavaScriptValue.CreateProperty
    (
        () => { return JavaScriptValue.CreateDateTime(DateTime.Now); }
    )
);

JS:

Formium.external.CSharpProject.now

运行:

20210129140851680.png


JS调用C#注册的字段

C#:

//注册值
obj.SetValue("version", JavaScriptValue.CreateString
    (
        Assembly.GetExecutingAssembly().GetName().Version?.ToString()
    )
);

JS:

Formium.external.CSharpProject.version

运行:
20210129140851680.png


JS调用C#注册的同步方法

C#:

//注册同步方法
obj.SetValue("messagebox", JavaScriptValue.CreateFunction(args =>
{
    var msg = args.FirstOrDefault(x => x.IsString);
    var text = msg?.GetString();
    InvokeIfRequired(() =>
    {
        MessageBox.Show(HostWindow, text, "Message from JS", MessageBoxButtons.OK, MessageBoxIcon.Information);
    });
    return JavaScriptValue.CreateString(text);
}));

JS:

Formium.external.CSharpProject.messagebox('oh shit')

运行:

20210129140851680.png

C#弹框:

20210129140851680.png


JS调用C#注册的异步方法

C#:

//注册异步方法
obj.SetValue("asyncmethod", JavaScriptValue.CreateFunction((args, callback) =>
{
    Task.Run(async () =>
    {
        var rnd = new Random(DateTime.Now.Millisecond);
        var rndValue = rnd.Next(1000, 2000);
        await Task.Delay(rndValue);
        var test = JavaScriptValue.CreateObject();
        test.SetValue("delayed", JavaScriptValue.CreateNumber(rndValue));
        test.SetValue("message", JavaScriptValue.CreateString($"Delayed {rndValue} milliseconds"));
        callback.Success(test);
    });
}));

JS:

Formium.external.CSharpProject.asyncmethod().success(time=>console.log(time));

运行:

20210129140851680.png


C#注册一个方法,JS调用并传递参数

C#:

//接收JS的一个参数
obj.SetValue("JsCallCSharp", JavaScriptValue.CreateFunction(args =>
    {
        var res = args.FirstOrDefault(x => x.IsString);
        MessageBox.Show(res.GetString());
        return null;
    }
));

JS:

Formium.external.CSharpProject.JsCallCSharp('oh shit');

运行:

20210129140851680.png

C# 弹框

20210129140851680.png


C#注册一个方法,JS调用并接收C#返回值

C#:

//向JS返回一个字符串
obj.SetValue("sayHi", JavaScriptValue.CreateFunction(args =>
    {
        return JavaScriptValue.CreateString("fuck you!");
    }
));

JS:

Formium.external.CSharpProject.sayHi();

运行:
20210129140851680.png


C#注册一个方法,接收JS的数组参数

C#:

//接收来自JS的一个数组
obj.SetValue("getArr", JavaScriptValue.CreateFunction(args =>
    {
        var arr = args.FirstOrDefault(x => x.IsArray);
        if (arr != null)
        {
            int len = arr.ArrayLength;
            for (int i = 0; i < len; i++)
            {
                int v = arr.GetValue(i).GetInt();
                Console.WriteLine("=============数组:" + v);
            }
        }
        return null;
    }
));

JS:

Formium.external.CSharpProject.getArr([1,3,5,7])

运行:
20210129140851680.png

C#这边打印数组:

20210129140851680.png


C#注册一个方法,接收JS的一个函数,执行这个JS函数,并将C#的值传递过去

C#:

//接收JS的一个函数
obj.SetValue("CallBack", JavaScriptValue.CreateFunction(args =>
   {
       var res = args.FirstOrDefault(x => x.IsFunction);
       if (res != null)
       {
           res.ExecuteFunctionAsync(GetMainFrame(),
               new JavaScriptValue[] { JavaScriptValue.CreateString("Hello from C#") });
       }
       return JavaScriptValue.CreateString("返回值~~~");
   }
));

JS:

Formium.external.CSharpProject.CallBack(function say(str) { console.log("C#的返回值:" + str);});

运行:

20210129140851680.png


三、结束

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


原文链接https://blog.csdn.net/qq_38693757/article/details/113334277

猜你喜欢

【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# Winform 热更新 基于ECSharp框架
目录一、简介二、&nbsp;ECSharp热更新演示三、Winform 热更新实战结束一、简介ECSharp (原:EasySharpFrame)github 地址:https://github.com/suxf/ECSharp介绍:1.HTTP服务 2.Websocket服务 3.HyperSocket&lt;自定义Socket服务&gt; 4.TimeFlow&lt;时间流&gt; 5.Sqlserver数据库助手 6.Mysql数据助手 7.Redis数据库助手 8.Log功能 9.热更新
发表于:2024-02-05 浏览:307 TAG:
【C#】c#开发桌面应用程序用什么框架
style="text-wrap: wrap;">在C#开发桌面应用程序时,可以使用以下几种常见的框架:</p><ol class=" list-paddingleft-2" style="width: 1529.1px; text-wrap: wrap;"><li><p>Windows Forms:这是一种由.NET Framework提供的GUI框架,它提供了丰富的GUI控件和易于使用的编程模型。Windows Forms在C#开发领域中使用非常广泛,并且已经存在多年,获得了广泛的支持和优化。</p></li></ol
发表于:2024-01-27 浏览:452 TAG:
【C#】C# Winform SplitContainer组件创建侧边菜单
效果一,SplitContainer 基本操作新建一个 Winform 项目,在Form1中拖进一个 SplitContainer 组件默认的界面如下这时候,你会发现,左侧菜单栏的宽度也太宽了吧,按照以前的经验,你一定会用鼠标去拖拽,这时候你就会发现,鼠标根本拖不动,不信你可以试试这时候,我们按Esc键,鼠标再移动到边框的时候,鼠标图标就会变成一个 “+” 状的图标,这时候就可以拖拽了此时,左侧的Panel1内还没有任何组件,运行后的效果我们添加一个按钮到&nbsp;Panel1 试试运行后发现
发表于:2024-02-01 浏览:550 TAG:
【C#】C#调用win10系统自带软键盘的方法
上次做了个笔记是关于调用windows系统自带的触摸键盘的方法:C#调用Windows系统自带触摸键盘的方法_c# 虚拟键盘-CSDN博客除了调用触摸键盘,我们也可以通过调用win10的自带软键盘作为输入途径。方法很简单。1、添加using System.Diagnostics引用。2、创建进程Process Winvirkey = Process.Start(&quot;osk.exe&quot;);3、打开键盘:Winvirkey = Process.Start(&quot;osk.exe&amp;
发表于:2024-01-29 浏览:367 TAG:
【C#】从零开始用C#写一个桌面应用程序(二)一个表白程序
恶搞表白小程序如何添加按钮,如何添加属性和事件请移步前文。基础操作第一步:新建窗口&nbsp;&nbsp;在工具箱内找到label和button,拖到form上,设置它们的size属性,autosize属性,text属性。第二步:添加事件为了实现我们的效果,需要给三个按钮分别设计点击事件,鼠标移入事件,鼠标点下事件。分别为click,mouseenter,mousedown事件。第三步:实现移动逻辑this获取form对象,clientsize获取实时大小,使用随机数值,设置对应按钮位置。将对应
发表于:2024-01-30 浏览:304 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 三层架构
一、介绍三层架构是 C# 桌面开发中比较常用的框架,是由&nbsp;表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构组成,目的是为了 “高内聚,低耦合”。开发人员分工更明确,将精力更专注于应用系统核心业务逻辑的分析、设计和开发,加快项目的进度,提高了开发效率,有利于项目的更新和维护工作。从三层架构可以看到,很类似于&nbsp;Web 前端开发的 MVC 框架(视图View,模型Model,控制Contorller),但本质上也有不同的地方,比如都有视图(三层中叫 UI),Mod
发表于:2024-02-03 浏览:295 TAG:
【C#】C# System.Windows.Forms.DataVisualization Demo案例
简介DataVisualization 其实就是Winform 中自带的 Chart 控件,整个图形控件主要由以下几个部份组成:1.Annotations --图形注解集合2.ChartAreas&nbsp; --图表区域集合3.Legends&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --图例集合4.Series  &nbsp; --图表序列集合(即图表数据对象集合)5.Titles   --图标的标题集合每个集合具体介绍,可以参考下面的帖子,看完了介绍,一定对你理解这个插件
发表于:2024-02-01 浏览:298 TAG:
【C#】Winform NanUI 0.77版本 JS和C#相互调用
目录一、导入插件二、常用方法三、C#和JS相互调用1.C# 调用JS2.JS调用C#方法3.完整版C#代码4.完整版JS代码结束一、导入插件用的NanUI版本0.77参考官方地址:https://docs.formium.net/zh-hans/tutorial/first-app.html二、常用方法基础代码:using&nbsp;NetDimension.NanUI; using&nbsp;NetDimension.NanUI.Browser; &nbsp; class&nbsp;MainW
发表于:2024-02-06 浏览:392 TAG: