【问题标题】:WinForm TabControl tab page contents does not update until the new tab is shownWinForm TabControl 选项卡页面内容在显示新选项卡之前不会更新
【发布时间】:2016-01-21 04:37:48
【问题描述】:

我有一个允许创建新选项卡的选项卡控件。每个新选项卡上都有一个 Web 浏览器控件 CEFSharp。创建新选项卡时,不会显示先前打开的选项卡;这就是我们想要的。

但是,新创建的标签页上的浏览器只是添加到标签页中,只是部分运行……直到标签页显示出来才进入加载状态。

这里是Tabpage的创建代码:

private void AddNewBrowser()
        {
            Log("Adding New Tab and Browser");

            UiBrowser browser = new UiBrowser();

            TabPage tp = new TabPage();

            tp.Controls.Add(browser);
            customTabControl1.TabPages.Add(tp);
        }

UiBrowser 是一个 UserControl,其中包含 CEFSharp 浏览器控件以及一些额外的 UI。

这是浏览器本身的启动代码。

private void UiBrowser_Load(object sender, EventArgs e)
        {
            Execute();
        }

private void Execute()
        {
            webBrowser = new ChromiumWebBrowser("http://google.co.uk")
            {
                Dock = DockStyle.Fill,
                Text = "Loading...",
                Tag = Tag
            };

            webBrowser.TitleChanged += Browser_TitleChanged;
            webBrowser.AddressChanged += Browser_AddressChanged;
            webBrowser.ConsoleMessage += Browser_ConsoleMessage;
            webBrowser.LoadingStateChanged += Browser_LoadingStateChanged;
            webBrowser.StatusMessage += Browser_StatusMessage;

            browserPanel.Controls.Add(webBrowser);
            Application.DoEvents();
        }

为了清晰起见,代码已被简化,我还没有在 SO 或其他地方找到解决此问题的方法。

问题: 如何让浏览器控件在后台加载网页?也就是说,控件打开的TabPage 不会向用户显示。

【问题讨论】:

    标签: c# winforms tabs user-controls cefsharp


    【解决方案1】:

    Load event 只会在控件第一次可见时发生:

    在控件第一次可见之前发生。

    所以尝试将您的 Execute 方法移动到 UserControl 的构造函数代码中。

    【讨论】:

    • 大声笑 - 没想到!您将获得更容易实施的答案。
    【解决方案2】:

    没有“官方”的方式来做到这一点。

    但是如果你真的需要它并且不害怕使用内部,你可以看看我对WinForms: Respond to BindingSource being applied的回答。

    解决方案(或hack)封装在这个小助手中

    public static class ControlUtils
    {
        static readonly Action<Control, bool> CreateControlFunc = (Action<Control, bool>)Delegate.CreateDelegate(typeof(Action<Control, bool>),
            typeof(Control).GetMethod("CreateControl", BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(bool) }, null));
    
        public static void CreateControls(this Control target)
        {
            if (!target.Created)
                CreateControlFunc(target, true);
            else
                for (int i = 0; i < target.Controls.Count; i++)
                    target.Controls[i].CreateControls();
        }
    }
    

    在表单加载事件结束时,添加以下内容

    this.CreateControls();
    

    customTabControl1.CreateControls();
    

    还有这里

    private void AddNewBrowser()
    {
        Log("Adding New Tab and Browser");
    
        UiBrowser browser = new UiBrowser();
    
        TabPage tp = new TabPage();
    
        tp.Controls.Add(browser);
        customTabControl1.TabPages.Add(tp);
    
        if (customTabControl1.Created)
            tp.CreateControls();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多