1)安装cefsharp.winform包
打开VS2017,打开nuget,找到cefsharp.winform,安装
问:为什么wpf程序不使用cefsharp.wpf?
答:因为cefwpf 49版本的bug很多,而winform_cef就比较靠谱,比如在不同的输入法切换后无法输入中文
问:那为什么不使用更高版本的cefwpf?
答:因为要支持XP,而49版本是cef_wpf能支持XP的最高版本
哦,业界毒瘤 ——XP和IE6
2):平台改成x64或者x86
因为Cefsharp没有针对AnyCpu的模式
3)代码如下:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
//***这段代码很关键,而且只需执行一次即可,最好写在静态构造函数中*** //
var settings = new CefSharp.CefSettings();
settings.CefCommandLineArgs.Add("disable-gpu", "1");
settings.CefCommandLineArgs.Add("force-device-scale-factor", "2");
Cef.Initialize(settings);
//********************************************************* //
var webbrowser = new ChromiumWebBrowser("https://www.baidu.com");
//为什么要用一个windowsformhost包起来,因为cef是winform的,所以在wpf下使用,必须用这个包一下
var winform = new WindowsFormsHost()
{
Child = webbrowser
};
//绑定,和js交互的关键,注册一个JsObj,这个可以自定义,然后对于js来说,第二个参数this就代表了JsObj
webbrowser.RegisterAsyncJsObject("JsObj", this, false);
this.Content = winform;
}
public void (object pramas)
{
//可以通过这种方式取得参数
var type = pramas.GetType();
var id=type.InvokeMember("id", System.Reflection.BindingFlags.GetProperty, null, pramas, null);
//do something.....
Application.Current.MainWindow.Dispatcher.BeginInvoke(new Action(() =>//报错
{
//do something.....
}));
Dispatcher.BeginInvoke(new Action(() => //不会报错
{
//do something.....
}));
}
}
上方代码中,display是被调方法,在执行display时,是子线程在执行,聪明的你一定想到了
那就Application.Current.MainWindow.Dispather.BeginInvoke,但是依然会报错,为什么?
因为在get mainwindow时依旧是操作了主线程的UI元素,所以改成下面那种方式即可
js代码:
<script type="text/javascript">
function abc()
{
JsObj.display(data);
}
</script>