CEFSharp弹出窗口转到新标签页。二次弹出窗口出现问题。

3

我正在制作一个程序,只加载一个网页。用户无法访问任何其他网页,此窗体为全屏窗口,没有边框。

我使用Windows表单和CefSharp制作了一个程序,但现在我遇到了不同的问题。当我尝试登录时,这个特定的网站会显示新的弹出窗口。通常在Chrome上,它只会为此打开另一个标签页,但是在这里,它不会新建标签页,而是弹出新的弹出窗口。因此,我编写了以下代码将弹出窗口定向到新标签页,但它只会为第一个选项卡页面中的第一个弹出窗口创建新标签页。

例如,页面1打开弹出窗口,则此代码获取该弹出窗口并创建选项卡页2。直到那时,它运行得非常好,但如果选项卡页2中有弹出窗口,则它只会弹出弹出窗口,而不是创建新标签页。

我该如何解决这个问题?请帮帮忙..我认为它仅为选项卡页面1中的弹出窗口创建新标签页,并且无论从选项卡页面2中获得什么弹出窗口,它都不会打开新标签页。有没有什么方法可以解决这个问题?

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

 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) { }
    }
1个回答

0

我曾经遇到过你的问题,所以我解决了它。

  1. 你应该将变量Life声明为全局变量 LifespanHandler life = new LifespanHandler();

  2. 在life_popup_request函数中添加:chromeBrowser.LifeSpanHandler = life;

    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.LifeSpanHandler = life; 
    
         chromeBrowser.Parent = myTabPage;
    
         chromeBrowser.Dock = DockStyle.Fill;
     });
    

    }

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接