目录
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);});
运行:
三、结束
如果你这个帖子对你有用,欢迎给我点赞 + 留言,谢谢