我在使用我用 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/