我正在制作一个仅加载一个网页的程序。用户无法访问任何其他网页,并且此Windows窗体是全屏显示,没有边界线。
我设法使用Windows窗体和cefsharp制作一个,但是现在我遇到了其他问题。当我尝试登录时,该特定网站显示新的弹出窗口。通常在chrome上,它会为此打开另一个标签,但是在这里,它不会创建新标签,而是会打开新的弹出窗口。因此,我做了如下代码将弹出窗口定向到newtab,但是它只为第一个选项卡页面的第一个弹出窗口创建了新的选项卡。
例如,第1页打开弹出窗口,然后此代码接收该弹出窗口并创建tabPage2。在此之前,它都可以正常工作,但是如果tabPage2中有弹出窗口,则只打开弹出窗口而不是创建新选项卡。
>该如何解决?请帮助..我在想它正在创建仅从tabPage1弹出的新选项卡,无论它从tabPage2弹出的内容如何,都不会打开新选项卡。有办法解决这个问题并解决它吗?
我正在Visual Studio 2017 Winform,cefsharp ver 67.0.0上执行此操作
主类
private void initialize_browser()
{
try
{
CefSettings settings = new CefSettings();
Cef.Initialize(settings);
//main browser
chromeBrowser = new ChromiumWebBrowser("url");
LifespanHandler life = new LifespanHandler();
chromeBrowser.LifeSpanHandler = life;
life.popup_request += life_popup_request;
this.tabPage1.Controls.Add(chromeBrowser);
chromeBrowser.Dock = DockStyle.Fill;
}
catch (Exception ex)
{
MessageBox.Show("Error in initializing the browser. Error: " + ex.Message);
}
}
private void life_popup_request(string popup_request)
{
this.Invoke((MethodInvoker)delegate ()
{
string title = "TabPage " + (tabControl1.TabCount + 1).ToString();
TabPage myTabPage = new TabPage(title);
tabControl1.TabPages.Add(myTabPage);
tabControl1.SelectTab(tabControl1.TabCount - 1);
ChromiumWebBrowser chromeBrowser = new ChromiumWebBrowser(popup_request);
chromeBrowser.Parent = myTabPage;
chromeBrowser.Dock = DockStyle.Fill;
});
}
LifespanHandler类
public class LifespanHandler : ILifeSpanHandler
{
//event that receive url popup
public event Action<string> popup_request;
bool ILifeSpanHandler.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)
{
//get url popup
if (this.popup_request != null)
this.popup_request(targetUrl);
//stop open popup
newBrowser = null;
return true;
}
bool ILifeSpanHandler.DoClose(IWebBrowser browserControl, IBrowser browser)
{ return false; }
void ILifeSpanHandler.OnBeforeClose(IWebBrowser browserControl, IBrowser browser) { }
void ILifeSpanHandler.OnAfterCreated(IWebBrowser browserControl, IBrowser browser) { }
}
答案 0 :(得分:0)
我遇到了和你一样的问题,所以我解决了。
你应该将变量 Life 声明为全局变量 LifespanHandler life = new LifespanHandler();
在 life_popup_request 函数中添加:chromeBrowser.LifeSpanHandler = life;
private void life_popup_request(string popup_request) { this.Invoke((MethodInvoker)delegate() { 字符串标题 = "TabPage " + (tabControl1.TabCount + 1).ToString();
TabPage myTabPage = new TabPage(title);
tabControl1.TabPages.Add(myTabPage);
tabControl1.SelectTab(tabControl1.TabCount - 1);
ChromiumWebBrowser chromeBrowser = new ChromiumWebBrowser(popup_request);
chromeBrowser.LifeSpanHandler = life;
chromeBrowser.Parent = myTabPage;
chromeBrowser.Dock = DockStyle.Fill;
});
}
祝你好运!