【C#】Winform NanUI 0.88版本 JS和C#相互调用
目录
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);});
运行:
三、结束
如果你这个帖子对你有用,欢迎给我点赞 + 留言,谢谢
原文链接https://blog.csdn.net/qq_38693757/article/details/113334277
猜你喜欢
- 【C#】C# Winfrom 常用功能整合-2
- 目录Winfrom 启动一个外部exe文件,并传入参数Winform ListBox用法HTTP下载文件(推荐)Winform HTTP下载并显示进度Winform HTTP下载文件Winform 跨线程访问UI组件Winform 改变文字的颜色和大小Winfrom 启动一个外部exe文件,并传入参数在我们常用的一些软件中,经常有些软件,双击之后根本打不开,这是因为启动时做了限制,我们需要传入一些参数才能打开,在工作中,这个需求也可以用在软件的自动更新上,
- 【C#】C# Winform 热更新 基于ECSharp框架
- 目录一、简介二、 ECSharp热更新演示三、Winform 热更新实战结束一、简介ECSharp (原:EasySharpFrame)github 地址:https://github.com/suxf/ECSharp介绍:1.HTTP服务 2.Websocket服务 3.HyperSocket<自定义Socket服务> 4.TimeFlow<时间流> 5.Sqlserver数据库助手 6.Mysql数据助手 7.Redis数据库助手 8.Log功能 9.热更新
- 【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
- 【C#】C# Winform SplitContainer组件创建侧边菜单
- 效果一,SplitContainer 基本操作新建一个 Winform 项目,在Form1中拖进一个 SplitContainer 组件默认的界面如下这时候,你会发现,左侧菜单栏的宽度也太宽了吧,按照以前的经验,你一定会用鼠标去拖拽,这时候你就会发现,鼠标根本拖不动,不信你可以试试这时候,我们按Esc键,鼠标再移动到边框的时候,鼠标图标就会变成一个 “+” 状的图标,这时候就可以拖拽了此时,左侧的Panel1内还没有任何组件,运行后的效果我们添加一个按钮到 Panel1 试试运行后发现
- 【C#】C#调用win10系统自带软键盘的方法
- 上次做了个笔记是关于调用windows系统自带的触摸键盘的方法:C#调用Windows系统自带触摸键盘的方法_c# 虚拟键盘-CSDN博客除了调用触摸键盘,我们也可以通过调用win10的自带软键盘作为输入途径。方法很简单。1、添加using System.Diagnostics引用。2、创建进程Process Winvirkey = Process.Start("osk.exe");3、打开键盘:Winvirkey = Process.Start("osk.exe&
- 【C#】从零开始用C#写一个桌面应用程序(二)一个表白程序
- 恶搞表白小程序如何添加按钮,如何添加属性和事件请移步前文。基础操作第一步:新建窗口 在工具箱内找到label和button,拖到form上,设置它们的size属性,autosize属性,text属性。第二步:添加事件为了实现我们的效果,需要给三个按钮分别设计点击事件,鼠标移入事件,鼠标点下事件。分别为click,mouseenter,mousedown事件。第三步:实现移动逻辑this获取form对象,clientsize获取实时大小,使用随机数值,设置对应按钮位置。将对应
- 【C#】从零开始用C#写一个桌面应用程序(一)基础操作
- 准备winform应用程序编写桌面应用客户端的技术。xaml一种标记语言。winform程序组成。 程序入口: form.cs和它的设计文件: 启动的过程以及涉及的文件:main函数: form1的构造函数和它的设计文件: main-》构造form-》initializeComponent-》 拖入一个 button控件可以看到: 这时我们已经梳理启动过程。使用组件的方法 可以在
- 【C#】C# Winform 三层架构
- 一、介绍三层架构是 C# 桌面开发中比较常用的框架,是由 表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构组成,目的是为了 “高内聚,低耦合”。开发人员分工更明确,将精力更专注于应用系统核心业务逻辑的分析、设计和开发,加快项目的进度,提高了开发效率,有利于项目的更新和维护工作。从三层架构可以看到,很类似于 Web 前端开发的 MVC 框架(视图View,模型Model,控制Contorller),但本质上也有不同的地方,比如都有视图(三层中叫 UI),Mod
- 【C#】C# System.Windows.Forms.DataVisualization Demo案例
- 简介DataVisualization 其实就是Winform 中自带的 Chart 控件,整个图形控件主要由以下几个部份组成:1.Annotations --图形注解集合2.ChartAreas --图表区域集合3.Legends --图例集合4.Series --图表序列集合(即图表数据对象集合)5.Titles --图标的标题集合每个集合具体介绍,可以参考下面的帖子,看完了介绍,一定对你理解这个插件