CEFSharp如何打开多标签并管理多标签

2020-09-09

修改部署平台

NuGet下载还原程序包

修改部分代码

如何把软件Title去掉

如何主动打开新标签页

多标签同步Cookie

右键功能

搜索文字功能

其他

本文核心部分为转载内容,下方为转载来源

CefSharp禁止弹出新窗体,在同一窗口打开链接,或者在新Tab页打开链接,并且支持带type="POST" target="_blank"的链接

原博做的已经能实现大部分功能,本文主要是在此基础上修改或添加一点东西,重复的操作不再赘述。下面的操作都是在原博代码的基础上进行改动。

修改部署平台

改成x64平台

image-20200909115307417

image-20200909115355211

NuGet下载还原程序包

1.项目点开引用手动删除带黄色感叹号的引用(不存在的引用,原博安装包未提供cef引用).

2.项目——右键引用——打开NuGet管理程序包,搜索cefsharp,点击CefSharp.Wpf(wpf项目)右侧选择最新版(当前版本v84.4.10,原博版本v75.1.143.0)下载,等待下载完成即可.

修改部分代码

由于原博版本太低或其他原因,我们需要修改一下代码

BrowserCtrl.xaml.cs

路径错误

image-20200909115811474

版本兼容

BrowserCtrl.xaml.cs

低版本将c#对象注册到js已经弃用

image-20200909115951346

RequestHandler.cs

image-20200909145355807

Post处理

原博说是可以实现_blank Post操作的,不过我有一个地方遇到了类似的情况,但post无法成功请求

我稍微改动了一下,即监听访问链接——循环JS将Form表单中的_blank给去掉,有点鸡肋...

Cef的FrameLoadStart事件

如何把软件Title去掉

如果不用其他UI框架的话,直接在主窗口设置WindowStyle="None"即可,但是这种方式有个弊端,他会把右上角那三个操作按钮(最大化、最小化、关闭)也给删除了,目前没找到好的处理方案。

如果用框架的话会比较简单,以Mahapps为例,主窗口设置ShowTitleBar="False"就可以将Title删除,这种方式会保留右上角的操作按钮。

image-20200909150706001

效果如下图:

image-20200910140944654

不论使用那种方式,一般删除了Title软件是无法用鼠标进行拖动的,此时我们需要重写OnMouseLeftButtonDown方法即可以实现拖动。

如何主动打开新标签页

一般我们都是右键打开新标签或者Ctrl+左单击打开新标签两种方式,此处展示一下Ctrl+左单击打开新标签,右键打开新标签没能实现...

RequestHandler.cs

源码摘要: Called on the UI thread before OnBeforeBrowse in certain limited cases where navigating a new or different browser might be desirable. This includes user-initiated navigation that might open in a special way (e.g. links clicked via middle-click or ctrl + left-click) and certain types of cross-origin navigation initiated from the renderer process (e.g. navigating the top-level frame to/from a file URL).

多标签同步Cookie

原博的多标签没有做cookie处理,我给他加上了,大概逻辑是网页启动前从文件(此处不一定要存文件,可以有更好的方案)加载一次cookie,网页加载完成后保存一次cookie(存到上诉的文件中)

修改的地方比较多,我主要放cookie操作的代码吧(以下展示非完整代码,完整代码在后面会放出来的)

此处我选择将BrowserCtrl.cs 里面的browser.IsBrowserInitializedChanged(已注释)放到BrowserDemoCtrl.xaml.cs中

BrowserDemoCtrl.xaml.cs

BrowserCtrl.xaml.cs

ExtChromiumBrowser.cs

右键功能

这个很简单,实现IContextMenuHandler接口即可,默认会给出一些选项,你可以根据自己的需求自定义添加删除或修改

搜索文字功能

实现IFindHandler接口即可,重写OnFindResult方法,可以在此方法中展示搜索结果

效果如下

GIF 2020-9-10 14-14-32

其他

说明:右键功能、搜索文字功能均没有给出代码,只是给出一个思路。

具体代码:https://github.com/logerlink/CefSharpDemo

详细操作请按照Readme文件进行