新入职一家公司, 由写服务端接口变成了软硬件通信, 服务器, 客户端, C/S,B/S 乱七八糟各种打杂. 首先接收一个 WPF 项目, 因为不熟 WPF, 再加上前端我也不熟, 我打算使用类似 webapp 的方式改造一下, 驱使我这样改造的原因是 ---- 我心里其实是期待着老板能看在我很忙很累的份上开开恩, 招个前端妹子来.
WPF 自己的 webbrowser 控件使用起来经常会 js 出错, 看网上说可以修改注册表提高 wpf 默认使用的 ie 浏览器版本, 最后决定使用 cefsharp.
包管理器下载安装了 cefsharp.wpf, 没注意版本.
编译报错, 提示需要. net 4.5.2 以上版本, 当前程序使用的是. net 4.0, 编译器为 vs2013.
工程右键 -> 属性 -> 目标框架, 下拉最高只有. net 4.5.1, 下载. net 4.5.2 Developer Pack 安装.
准备工作结束, 直接上代码
准备 html
- <html>
- <head>
- <meta charset="utf-8">
- <link href="CSS/bootstrap.min.css?v=3.4.0" rel="stylesheet">
- <script language="JavaScript" type="text/javascript">
- function Selec()
- {
- bound.MyMethod();
- }
- </script>
- </head>
- <body oncontextmenu='return false' onselectstart='return false'>
- <input type="text" class="form-control"> <span class="help-block m-b-none"> 部门列表 </span>
- <input type="submit" value="保存" onclick="Selec()">
- </body>
- </html>
xaml 布局文件不需要改动, 相应 cs 文件
在构造函数中加入
- //var browser = new CefSharp.Wpf.ChromiumWebBrowser();
- this.Content = browser;
- browser.Address = @"c:/html/Department.html";// 文件路径
- browser.RegisterJsObject("bound", new BoundObject(), new CefSharp.BindingOptions { CamelCaseJavascriptNames = false });// 次函数有对应异步方法 (RegisterAsyncJsObject), 区别和使用场景没仔细看
在定义一个类供 js 调用的 c# 方法
- public class BoundObject
- {
- public void MyMethod()
- {
- MessageBox.Show("success");
- }
} new CefSharp.BindingOptions { CamelCaseJavascriptNames = false } 参数区分大小写.
好了, 启动点击保存, 弹出了了对话框.
还可以在 xaml 中使用
- xmlns:cefSharp="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
- d:DesignHeight="900" d:DesignWidth="1240">
- <Grid>
- <cefSharp:ChromiumWebBrowser Name="mychrome" Height="900" Width="1240"/>
- </Grid>
对应 cs 文件中作相应更改
- var browser = new CefSharp.Wpf.ChromiumWebBrowser();
- mychrome = browser;
- browser.Address = CGlobal.InstallPath + "html/Department.html";
- browser.RegisterAsyncJsObject("bound", new BoundObject(), new CefSharp.BindingOptions { CamelCaseJavascriptNames = false }); //Standard object rego
完善:
禁用右键 方法 1
cs 文件中加入
browser.MenuHandler = new MenuHandler();
MenuHandler 继承自接口 IContextMenuHandler
- public class MenuHandler : CefSharp.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;
- }
- }
方法 2: 修改 HTML 文件
<body oncontextmenu='return false'>
禁止鼠标选中:
<body oncontextmenu='return false' onselectstart='return false'>
详情参考: https://github.com/cefsharp/CefSharp/wiki
来源: https://blog.csdn.net/u012754211/article/details/71629337