在CEFSharp中处理OnBeforePopUp时如何设置新浏览器的Frame Name

时间:2016-11-03 18:22:18

标签: c# winforms cefsharp

我在使用WinForms编写的自定义CEFSharp浏览器中工作的特定网站遇到问题。据我所知,他们正在用javascript" window.open"打开一个URL。方法并为新窗口指定一个特定名称。我认为问题是我弹出窗口的实现不允许他们将这个引用保留在新窗口中。

我已经实现了ILifeSpanHandler并且正在处理OnBeforePopup方法。我可以看到他们的名字来自" targetFrameName"参数,但我不知道如何将它分配给我正在创建的新IWebBrowser。非常感谢任何帮助!

以下是我的代码的相关部分:

public class LifeSpanHandler : ILifeSpanHandler
{
    MainForm mainForm;

    public LifeSpanHandler(MainForm form)
    {
        mainForm = form;
    }

    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)
    {            
        newBrowser = mainForm.AddNewBrowserTab(targetUrl);
        //how to add the targetFrameName parameter to this newBrowser?
        return true;
    }

1 个答案:

答案 0 :(得分:0)

您告诉CEF不要创建新窗口,然后将URL加载到您手动创建的其他浏览器实例中。您需要做的是将CEF创建的新浏览器实例路由到TabControl中的主机控件。

        newBrowser = null;

        var control = mainForm.AddNewBrowserTab(targetUrl);

        var rect = control.ClientRectangle;
        control.Invoke(new Action(() => windowInfo.SetAsChild(control.Handle, rect.Left, rect.Top, rect.Right, rect.Bottom)));

        return false;

返回false非常重要,让CEF创建窗口。

    public Control AddNewTab2()
    {
        Control hostControl = new Control { Dock = DockStyle.Fill };

        TabPage tab = new TabPage();
        tab.Controls.Add(hostControl);

        this.tabControl1.Invoke(new Action(() => { this.tabControl1.Controls.Add(tab); }));

        return hostControl;
    }