目录
1.下载Cefsharp
2:引用
cefsharp需要选择x64或者x86平台。否则添加引用的时候会报错(引用感叹号!)
如下图:如果没有对应平台可以自己添加。
然后项目右键,添加引用,找到对应平台(x64\x86),下载成功后的包会在项目的packages中
3:初始化
string str = System.IO.Directory.GetCurrentDirectory() + "\\CSIndex\\Index.html";
ChromiumWebBrowser webview = new ChromiumWebBrowser(str)
{
BrowserSettings = { DefaultEncoding = "UTF-8" },
JsDialogHandler = new Msg(),//重写js弹框
Dock = DockStyle.Fill,
};
this.Controls.Add(webview);
3.1:重写js弹框类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CefSharp;
using System.Windows.Forms;
namespace Winform测试js
{
class Msg : IJsDialogHandler
{
public bool OnBeforeUnloadDialog(IWebBrowser chromiumWebBrowser, IBrowser browser, string messageText, bool isReload, IJsDialogCallback callback)
{
throw new NotImplementedException();
}
public void OnDialogClosed(IWebBrowser chromiumWebBrowser, IBrowser browser)
{
throw new NotImplementedException();
}
public bool OnJSDialog(IWebBrowser chromiumWebBrowser, IBrowser browser, string originUrl, CefJsDialogType dialogType, string messageText, string defaultPromptText, IJsDialogCallback callback, ref bool suppressMessage)
{
switch (dialogType)
{
case CefJsDialogType.Alert:
MessageBox.Show(messageText, "提示");
suppressMessage = true;
return false;
case CefJsDialogType.Confirm:
var dr = MessageBox.Show(messageText, "提示", MessageBoxButtons.YesNo);
if (dr == DialogResult.Yes)
{
callback.Continue(true, string.Empty);
suppressMessage = false;
return true;
}
else
{
callback.Continue(false, string.Empty);
suppressMessage = false;
return true;
}
case CefJsDialogType.Prompt:
MessageBox.Show("系统不支持prompt形式的提示框", "提示");
break;
default:
break;
}
return false;
}
public void OnResetDialogState(IWebBrowser chromiumWebBrowser, IBrowser browser)
{
throw new NotImplementedException();
}
}
}
4:C#调用JS
CefSharpSettings.LegacyJavascriptBindingEnabled = true;//运行运行JavaScript
int ren = 80;
string script = "refresh_top(" + ren + ")";
webview.ExecuteScriptAsync(script);//执行js中的函数
5:JS调用C#
5.1:首先创建一个类
5.2:注入
注入方法
/// <summary>
/// 注册注入类
/// </summary>
/// <param name="ijtname">注入类的别名</param>
/// <param name="classname">类</param>
public void Injection(string ijtname,object classname)
{
webview.JavascriptObjectRepository.ResolveObject += (s, eve) =>
{
var repo = eve.ObjectRepository;
if (eve.ObjectName == ijtname)
{
repo.Register(ijtname, classname, isAsync: true, options: BindingOptions.DefaultBinder);
}
};
}
注册注入
JsToClass jtc = new JsToClass();
Injection("jstoclass", jtc);//新注入
5.3:js调用
$(function () {
//点击事件
$("#dj").click(function () {
show("你好")
})
})
CefSharp.BindObjectAsync("jstoclass");//使用刚刚注册类的别名
function show(str) {
jstoclass.showmsg(str);
}
//接收返回值示例
function updatepeople(a, b) {
jstoclass.update(a, b).then((r) => { show(r) });
}