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

目录

一、需求

版本

二、实例

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

运行:

JS调用C#注册的字段

C#:

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

JS:

Formium.external.CSharpProject.version

运行:

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

运行:

C#弹框:

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

运行:

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');

运行:

C# 弹框

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

C#:

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

JS:

Formium.external.CSharpProject.sayHi();

运行:

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

运行:

C#这边打印数组:

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);});

运行:

三、结束

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊思宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值