【问题标题】:Is SuspendLayout/ResumeLayout worthless or am I going about it wrong?SuspendLayout/ResumeLayout 是一文不值还是我做错了?
【发布时间】:2012-08-16 07:16:55
【问题描述】:

我有两个标签页托管 TableLayoutPanel,我用标签和文本框动态填充它们。第一个有 96 个标签和 96 个文本框,它的闪烁是可以接受/可以容忍的,所以我没有费心添加 SuspendLayout/ResumeLayout 对。

但是,第二个有 96 个标签和 288 个文本框,它的绘画/闪烁是无法忍受的。 IOW,192 控制似乎还可以,但 384 绝对不行。

我在动态创建控件之前调用了 SuspendLayout,然后在 finally 块中调用了 ResumeLayout,但是删除了它们,瞧!与第一个 tabPage/TLP 一样,闪烁是可以接受的。

为什么这种减法加法有效?

【问题讨论】:

  • SuspendLayoutControl 类的方法。你打电话给哪个Control
  • 好提示;我在“这个”(表格)上调用它。因此,我尝试在 tabPage 和 TableLayoutPanel 上都调用它。它似乎没有比注释掉对 this.SuspendLayout() 和 this.ResumeLayout() 的调用更好/更差。
  • 我以前用过帕桑特的那个密码,效果很好,但神明不想用,觉得太神秘了。
  • 我已经用 ScrollToCaret() 测试了 SuspendLayout() 并且它会产生闪烁并且不会暂停布局。如果您的布局涉及移动滚动位置,则此方法调用实际上不会暂停屏幕更新。

标签: c# winforms dynamic tabs tablelayoutpanel


【解决方案1】:

您也可以尝试这两种方法,我已在此线程中列出。希望他们不会太神秘:

https://stackoverflow.com/a/15020157/1307504

此方法真正暂停和恢复布局。但是你永远不要忘记打电话给EndControlUpdate()

我在我创建的任何通用控件中使用它。我尝试了很多暂停和恢复布局。它从来没有像我想象的那样奏效。

【讨论】:

    【解决方案2】:

    最初,我同样怀疑SuspendLayoutResumeLayout 是否真的有效。然后我自己尝试并创建了一个示例应用程序,并在以后更好地了解了这个概念。

    所以,这就是我所做的:

    mainPanel.SuspendLayout()
    
    create child control
    
    call child.SuspendLayout()
    
    change the child control properties
    
    add the child control to the mainPanel
    
    call child.ResumeLayout(false) - this means: next layout run, relayout this control, but not immediately
    
    repeat (2-6) for every child-control
    
    call mainPanel.ResumeLayout(true) - this means: relayout my mainPanel and every child-control now!
    

    也是为了证明我的概念这里是示例应用程序

    Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();
    
            this.SuspendLayout();
            for (int i = 0; i < 2000; i++)
            {
                var textbox = new TextBox();
                //textbox.SuspendLayout();
                //textbox.Dock = i% 2 ==0 ? DockStyle.Left : DockStyle.Right;
                textbox.Dock = DockStyle.Fill;
                textbox.Top = i * 10;
                textbox.Text = i.ToString();
                this.Controls.Add(textbox);
                //textbox.ResumeLayout(false);
    
            }
            stopWatch.Stop();
            TimeSpan ts = stopWatch.Elapsed;
            string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",ts.Hours, ts.Minutes, ts.Seconds,ts.Milliseconds / 10);
    
            this.ResumeLayout(true);
            MessageBox.Show(elapsedTime);
    

    【讨论】:

    • 别忘了注释掉 this.SuspendLayout() 和 this.ResumeLayout(True)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    相关资源
    最近更新 更多