如何处理 CefSharp 中的弹出链接

How to handle popup links in CefSharp

我正在使用 CefSharp 39.0.2 创建一个选项卡式 Web 浏览器。现在,如果用户单击网站上的 link,它将打开一个新的 window,其中包含我原来的 UI 的 none。例如,当您单击 Google 新闻上的一篇文章 link 时,它会在新的 window 中打开,但没有我编写的任何浏览控件。我还研究了 Cef.WinForms.Example 程序,它做的事情完全一样。

是否可以用不同的方式处理这个问题?我希望 link 在新选项卡中打开,或者在新的 window 中打开(所有控件都在那里)。我一直在查看 GitHub 问题,但我找不到这样的东西(也许我还不够努力,因为我认为这也是其他人想要做的......)。我查看了浏览器控件的所有 events,但我找不到任何看起来像他们处理它的东西。

ChromiumWebBrowser 有一个 LifeSpanHandler 属性。要在 Cefsharp 中手动控制弹出窗口 windows,您必须实现自己的实现 ILifeSpanHandle 接口的生命周期处理程序对象。

每次浏览器想要打开一个新的 window 时,它都会调用您的生命周期处理程序的 OnBeforePopup 函数。在这里您可以实现您想要的行为。如果你returnfalse,浏览器会弹出一个新的window。如果您 return true,浏览器将忽略弹出操作,但您可以手动创建新 window、新标签等...

这是自定义生命周期处理器的一个非常简单的例子。在弹出请求时,它会触发一个名为 PopupRequest 的事件。您可以订阅此类事件并手动创建新的 window/tab。然后,return指示 ChromiumWebBrowser 不要创建自己的新 window 是正确的。但是,您需要自己实现使用另一个 ChromiumWebBrowser 创建新的 window。

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)
    {

    }
}