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 > |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?