为什么在WinForm中隐藏控件要比使其可见花费更长的时间



我有一个包含56个复选框的FlowLayoutPanel。复选框用于三状态模式。现在是有趣的部分。如果复选框未被选中,则表示它们未被使用,可以隐藏以方便阅读。为了隐藏它们,我使用了另一个复选框。当用户单击复选框时,FlowPanel中所有未使用的复选框都将使用foreach迭代隐藏。

问题是,要隐藏它们,foreach调用(checkBox.Visible=false)大约需要2-3秒,而显示它们(checkBox.Visible=true)需要0.5秒。

关于为什么会发生这种情况,有什么建议吗?

private void hideUnusedPinsCheckBoxClick(objest sender, EventArgs e)
{
   bool state = !hideUnusedPinsCheckBox.Checked;
   foreach(object obj in flowLayoutPanel.Controls)
   {
      CheckBox cB = (CheckBox)obj;
      if(cB.CheckState == CheckState.Unchecked)
         cB.Visible=state;
   }
}

您可以尝试在隐藏所有复选框之前调用SuspendLayout,然后再调用ResumeLayout。有关详细信息,请参阅此链接。

回答您关于为什么会发生这种情况的问题。每次在FlowLayoutPanel上隐藏(或显示)控件时,都会执行面板布局算法,以便重新排列屏幕上的所有内容。例如,如果一行隐藏50个复选框,则layouter算法将至少执行1275次。例如:

- Hide checkbox
- Perform layout for remaining 49 check boxes
- Hide checkbox
- Perform layout for remaining 48 check boxes
- Hide checkbox
- Perform layout for remaining 47 check boxes
- etc...

通过调用SuspendLayout,layouter算法根本不会运行,直到您调用ResumeLayout,将数字从1275减少到1。

如果隐藏了什么,系统必须找出该obect下面的内容,并强制该内容重新绘制自己。

另一方面,当使控件可见时,必须仅绘制该控件。

最新更新