如何在CefSharp中处理弹出链接

15
我正在使用CefSharp 39.0.2创建一个带选项卡的Web浏览器。目前,如果用户单击网站上的链接,它将打开一个全新的窗口,其中没有我的原始UI。例如,当您单击Google News上的文章链接时,它会在新窗口中打开,但没有我设计的任何浏览控件。我还查看了Cef.WinForms.Example程序,它也是完全一样的。
有没有可能以不同的方式处理这个问题?我希望链接可以在新标签页中打开,或者在新窗口中打开(并且包含所有的控件)。我已经在GitHub问题中搜索过,但找不到类似的内容(也许我没有仔细寻找,因为我认为其他人也想做到这一点......)。我已经查看了浏览器控件的所有事件,并没有找到似乎能够处理此问题的任何事件。
1个回答

24

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

    }
}

LifeSpanHandler 属性默认情况下在编辑器中是隐藏的。您必须手动在编辑器中编写(没有智能感知)。 - Henrique

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接