我正在使用CefSharp 39.0.2
创建标签式网络浏览器。现在,如果用户点击网站上的链接,它将打开一个没有我原始UI的新窗口。例如,当您点击Google新闻上的文章链接时,它会在新窗口中打开,但没有我编写的任何浏览控件。我也查看了Cef.WinForms.Example
程序,它也做了同样的事情。
是否有可能以不同的方式处理这个问题?我希望链接可以在新选项卡中打开,也可以在新窗口中打开(包含所有控件)。我一直在查看GitHub问题,我找不到这样的东西(也许我看起来不够努力,因为我认为这也是其他人想要做的......)。我查看了浏览器控件的所有events
,但我找不到任何看起来像是处理它的内容。
答案 0 :(得分:13)
ChromiumWebBrowser
具有LifeSpanHandler
属性。要在Cefsharp中手动控制弹出窗口,您必须实现自己的生命周期处理程序对象,以实现ILifeSpanHandle
接口。
每次浏览器想要打开一个新窗口时,它都会调用您的生命周期处理程序的OnBeforePopup
函数。在这里,您可以实现所需的行为。如果您返回false
,浏览器将弹出一个新窗口。如果您返回true
,浏览器将忽略弹出操作,但您可以手动创建新窗口,新标签等...
这是一个非常简单的自定义寿命处理示例。在弹出请求中,它会触发一个名为PopupRequest的事件。您可以订阅此类事件并手动创建新窗口/选项卡。然后,它返回true,指示ChromiumWebBrowser
不要创建自己的新窗口。但是,您需要自己创建另一个ChromiumWebBrowser
创建新窗口。
public class SampleLifeSpanHandler: ILifeSpanHandler
{
public event Action<string> PopupRequest;
public bool OnBeforePopup(IWebBrowser browser, string sourceUrl, string targetUrl, ref int x, ref int y, ref int width,
ref int height)
{
if (PopupRequest != null)
PopupRequest(targetUrl);
return true;
}
public void OnBeforeClose(IWebBrowser browser)
{
}
}