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

标签 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;
    }

最佳答案

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

关于c# - 在 CEFSharp 中处理 OnBeforePopUp 时如何设置新浏览器的框架名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40408695/

相关文章:

c# - 检查未锁定的文件是否打开

c# - Java 和 C# 客户端无法通过安全的 DataStax Enterprise 3.1 服务器进行身份验证

c# - CefSharp WPF 和 MVVM?

加载新网站时 CEFSharp 绑定(bind)对象丢失

CefSharp 获取页面截图

c# - Entity Framework 中 "The RelatedEnd cannot be returned by this RelationshipManager"异常的根本原因是什么?

c# - 属性 'luismodel' 在此声明类型上无效

c# - 如何在两个不同的选项卡上显示相同的控件?

C# winforms gridview 以编程方式绑定(bind)数据后排序

c# - 如何通过鼠标单击找出拆分容器中的哪个面板被单击?