新入职一家公司,由写服务端接口变成了软硬件通信、服务器、客户端、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://www.cnblogs.com/lonelyxmas/p/9626856.html
时间: 2024-10-15 22:49:20