6

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

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

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

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

4

2 回答 2

9

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

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

这种方法真正暂停和恢复布局。但是你永远不应该忘记打电话EndControlUpdate()

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

于 2013-03-13T12:37:07.737 回答
2

最初,我有同样的疑问,SuspendLayout并且ResumeLayout确实有效。然后我自己尝试并创建了一个示例应用程序,并在以后更好地了解了这个概念。

所以,这就是我所做的:

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);
于 2017-08-18T16:49:36.597 回答