Winforms 如何处理CefSharp中的弹出链接

Winforms 如何处理CefSharp中的弹出链接,winforms,cefsharp,chromium-embedded,Winforms,Cefsharp,Chromium Embedded,我正在使用CefSharp 39.0.2创建一个选项卡式web浏览器。现在,如果用户单击网站上的链接,它将打开一个新窗口,其中没有我原来的UI。例如,当你点击谷歌新闻上的一篇文章链接时,它会在一个新窗口中打开,但没有我制作的任何浏览控件。我还研究了Cef.WinForms.Example程序,它做了同样的事情 有没有可能以不同的方式处理这个问题?我希望链接可以在新选项卡中打开,也可以在新窗口中打开(所有控件都在那里)。我一直在研究GitHub的问题,但我找不到类似的东西(也许我没有认真研究,因为

我正在使用
CefSharp 39.0.2
创建一个选项卡式web浏览器。现在,如果用户单击网站上的链接,它将打开一个新窗口,其中没有我原来的UI。例如,当你点击谷歌新闻上的一篇文章链接时,它会在一个新窗口中打开,但没有我制作的任何浏览控件。我还研究了
Cef.WinForms.Example
程序,它做了同样的事情


有没有可能以不同的方式处理这个问题?我希望链接可以在新选项卡中打开,也可以在新窗口中打开(所有控件都在那里)。我一直在研究GitHub的问题,但我找不到类似的东西(也许我没有认真研究,因为我认为这也是其他人想要做的…)。我查看了浏览器控件的所有
事件
,找不到任何类似于它们处理的事件。

ChromiumWebBrowser
具有
Lifespan Handler
属性。要手动控制Cefsharp中的弹出窗口,您必须实现自己的生命周期处理程序对象,实现
ILifeSpanHandle
界面

每次浏览器想要打开一个新窗口时,它都会调用寿命处理程序的
onbeforepoop
函数。在这里,您可以实现所需的行为。如果返回
false
,浏览器将弹出一个新窗口。如果您返回
true
,浏览器将忽略弹出操作,但您可以手动创建新窗口、新选项卡等

这是一个非常简单的自定义寿命hander示例。在弹出请求时,它触发一个名为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)
    {

    }
}
public类SampleLifeSpanHandler:ILifeSpanHandler
{
公共事件行动要求;
public bool OnBeforePopup(IWebBrowser浏览器、字符串源URL、字符串目标URL、ref int x、ref int y、ref int width、,
参考整数高度)
{
if(PopupRequest!=null)
PopupRequest(targetUrl);
返回true;
}
关闭之前的公用void(IWebBrowser浏览器)
{
}
}

默认情况下,LifeSpanHandler属性隐藏在编辑器上。您必须在编辑器上手动写入(不带intellisense)。