项目要求:在一个3*2多屏界面上显示2个不同网站内容。在使用分屏软件Radeon设置多次失败后,我们决定使用其它替代方案——使用winform程序嵌入浏览器展示网页。
C#设定分屏布局,然后使用WebBrowser展示百度首页,几分种搞定,非常顺利。自以为搞定之际,使用指定的网站地址测试时,发现报js异常。
经过排查,发现WebBrowser使用的是IE内核。而我们指定的网站,对于IE兼容性差,只能选择其它方案。
此种方案失败。
接着,尝试把WebBrowser控件替换为Chrome内核,经过测试,发现兼容性居然还存在问题。
很郁闷,还是失败。
发现CefSharp真是个好东西,不但开源、支持Chromium内核,还具备Winform和WPF的版本。awesominum可以允许把网页嵌入到 3D 画面或游戏中,支持Unity3D,于是决定潜心研究。
代码示例:
using System;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;
namespace BigScreen
{
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
InitBrowser();
}
public ChromiumWebBrowser browser;
public void InitBrowser()
{
Cef.Initialize(new CefSettings());
browser = new ExtChromiumBrowser("www.baidu.com");
this.tableLayoutPanel1.Controls.Add(browser);
browser.Dock = DockStyle.Fill;
}
}
}
踩到的一些坑:
1.使用NuGet添加CefSharp相关包,遇到莫名问题,弃用之。改用下载zip包,手动添加引用,并且将包资源放到 /bin/debug 目录下,提示成功。
2.编译时,Platform 必须指定 x64/x86 平台,不能使用Any CPU,否则会编译出错。
编译允许,正是所需要的效果,总算踩过第一个坑。
由于网站存在打开新页面的情况,需要不弹出页面的功能,只能优化控件。
public class CefLifeSpanHandler : CefSharp.ILifeSpanHandler
{
public CefLifeSpanHandler() {}
public bool DoClose(IWebBrowser browserControl, CefSharp.IBrowser browser)
{
if (browser.IsDisposed || browser.IsPopup)
{
return false;
}
return true;
}
public void OnAfterCreated(IWebBrowser browserControl, IBrowser browser)
{
}
public void OnBeforeClose(IWebBrowser browserControl, IBrowser browser)
{
}
public bool OnBeforePopup(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser)
{
var chromiumWebBrowser = (ExtChromiumBrowser)browserControl;
chromiumWebBrowser.Load(targetUrl);
newBrowser = null;
return true;
}
}
public class ExtChromiumBrowser : ChromiumWebBrowser
{
public ExtChromiumBrowser() : base(null)
{
this.LifeSpanHandler = new CefLifeSpanHandler();
//this.DownloadHandler = new DownloadHandler(this);
}
public ExtChromiumBrowser(string url) : base(url)
{
this.LifeSpanHandler = new CefLifeSpanHandler();
}
public event EventHandler StartNewWindow;
public void OnNewWindow(NewWindowEventArgs e)
{
if (StartNewWindow != null)
{
StartNewWindow(this, e);
}
}
}
using System;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;
namespace BigScreen
{
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
InitBrowser();
}
public ExtChromiumBrowser browser;
public void InitBrowser()
{
Cef.Initialize(new CefSettings());
browser = new ExtChromiumBrowser("www.baidu.com");
this.tableLayoutPanel1.Controls.Add(browser);
browser.Dock = DockStyle.Fill;
}
}
}
到此,总算完成需求,告一段落!