cefsharp 弹出到新选项卡。二次弹出窗口有问题

问题描述 投票:0回答:1

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

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

例如,第 1 页打开弹出窗口,然后此代码采用该弹出窗口并创建 tabPage 2。到那时它工作得很好,但如果 tabPage2 中有弹出窗口,它只会打开弹出窗口,而不是创建新选项卡。

我该如何解决这个问题?请帮忙..我认为它正在创建仅从 tabPage1 弹出的新选项卡,而无论从 tabPage2 获得什么弹出窗口,它都不会打开新选项卡。有办法解决这个问题并解决它吗?

我正在 Visual Studio 2017 winform、cefsharp 版本 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) { }
    }
c# cefsharp
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;
         });
     }
    

祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.