CefSharp 与 JS交互
创建WPF项目,然后NuGet安装包:CefSharp.Wpf
一、基本使用
Loaded += (m, n) =>
{
#region 加载HTML
CefSharpSettings.WcfEnabled = true;
var browser = CefSharpHelper.Browser;
string address = ConfigurationManager.AppSettings["STARTURL"];
Regex regex = new Regex(@"^https?:\/\/(?<host>[^/]+)(?<path>\/[^?]*)?(?<query>\?[^#]*)?(?<anchor>\#.*)?$");
address = regex.IsMatch(address) ? ConfigurationManager.AppSettings["STARTURL"] : System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, address);
//清理本地存储数据
Cef.GetGlobalCookieManager().DeleteCookies("", "");
browser.MenuHandler = new MenuHandler();
//注册JsObj对象JS调用C#
browser.JavascriptObjectRepository.Register("interop", new JavascriptCallback(browser, this), isAsync: false);
browser.Load(address);
gridMain.Children.Add(browser);
#endregion
};
二、阻止WebBrower默认行为
#region 阻止WebBrower默认行为
/// <summary>
/// 调用方式:
/// browser.MenuHandler = new MenuHandler();
/// </summary>
public class MenuHandler : IContextMenuHandler
{
public void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model)
{
model.Clear();
}
public bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags)
{
return false;
}
public void OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame)
{
}
public bool RunContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model, IRunContextMenuCallback callback)
{
return false;
}
}
#endregion
三、提供前端HTML调用函数
#region CefSharp帮助类
/// <summary>
/// 单列模式
/// </summary>
public class CefSharpHelper
{
private static ChromiumWebBrowser _browser;
private static readonly object _syncRoot = new object();
public static ChromiumWebBrowser Browser
{
get
{
if (_browser == null)
{
lock (_syncRoot)
{
if (_browser == null)
{
CefSettings settings = new CefSettings();
Cef.Initialize(settings);
// 创建浏览器实例
_browser = new ChromiumWebBrowser();
}
}
}
return _browser;
}
}
}
/// <summary>
/// JS调用C#函数
/// </summary>
public class JavascriptCallback
{
private static MainWindow _window;
private static ChromiumWebBrowser _chromiumWebBrowser;
//构造方法
public JavascriptCallback(ChromiumWebBrowser chromiumWebBrowser, MainWindow window)
{
_window = window;
_chromiumWebBrowser = chromiumWebBrowser;
_chromiumWebBrowser.FrameLoadEnd += OnFrameLoadEnd;
}
// 窗口加载完毕时需要执行的全局JS对象
public void OnFrameLoadEnd(object sender, FrameLoadEndEventArgs e)
{
if (e.Frame.IsMain)
{
//显示源代码
//_chromiumWebBrowser.ShowDevTools();
_chromiumWebBrowser.GetFocusedFrame().EvaluateScriptAsync("(function(){CefSharp.BindObjectAsync('interop');})()").Await();
}
}
// 提供前端HTML调用,如:interop.on(number);
public bool on(string input)
{
int number;
if (int.TryParse(input, out number))
{
return true;
}
return false;
}
// 提供前端HTML调用,如:interop.off(number);
public bool off(string input)
{
int number;
if (int.TryParse(input, out number))
{
return true;
}
return false;
}
}
#endregion
四、配置文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="STARTURL" value="index.html"/>
</appSettings>
</configuration>

浙公网安备 33010602011771号