Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在CEFSharp中处理OnBeforePopUp时如何设置新浏览器的框架名称_C#_Winforms_Cefsharp - Fatal编程技术网

C# 在CEFSharp中处理OnBeforePopUp时如何设置新浏览器的框架名称

C# 在CEFSharp中处理OnBeforePopUp时如何设置新浏览器的框架名称,c#,winforms,cefsharp,C#,Winforms,Cefsharp,我在使用WinForms编写的自定义浏览器中使用某个特定站点时遇到问题。据我所知,他们正在使用javascript“window.open”方法打开一个URL,并为新窗口指定一个特定的名称。我认为问题在于我的弹出窗口实现不允许他们保留对新窗口的引用 我已经实现了一个ILifeSpanHandler,正在处理OnBeforePopup方法。我可以通过“targetFrameName”参数看到它们的名称,但我不知道如何将其分配给我正在创建的新IWebBrowser。任何帮助都将不胜感激 以下是我的代

我在使用WinForms编写的自定义浏览器中使用某个特定站点时遇到问题。据我所知,他们正在使用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;
    }

您告诉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;
    }