【问题标题】:Why does hiding controls in WinForm take longer than making them visible?为什么在 WinForm 中隐藏控件比使其可见需要更长的时间?
【发布时间】:2012-09-12 18:25:15
【问题描述】:

我有一个包含 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;
   }
}

【问题讨论】:

  • 只是一个“元建议”:获取您选择的性能分析器(例如ANTS Performance Profiler)并衡量需要多长时间。
  • 我知道将它们隐藏起来比使其可见需要更长的时间。
  • 您是否尝试过在flowLayoutPanel 上调用SuspendLayoutResumeLayout 来包装循环?
  • @RobertIagar 是的,这就是您在问题标题中已经说明的内容。我的建议是帮助您找出“为什么”。
  • @Damien_The_Unbeliever 确实有效,但这不是问题的答案。

标签: c# winforms performance


【解决方案1】:

您可以尝试在隐藏所有复选框之前调用SuspendLayout,然后再调用ResumeLayout。请参阅this link 了解更多信息。

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

- 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,将数量从 1,275 减少到 1。

【讨论】:

  • 看,我将此作为评论发布,因为它实际上并没有回答所提出的问题......
  • @Damien_The_Unbeliever 是的,抱歉没有早点看到。我重新选择了问题的答案。感谢您的帮助。
  • @RobertIagar 我已经修改了答案以解释为什么它运行缓慢。
【解决方案2】:

如果你隐藏了一些东西,系统必须找出那个对象下面的东西,并强制那个东西重新绘制自己。

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

【讨论】:

  • 这意味着如果我反过来(从底层开始)会改善吗?
  • 不确定...最好先试试 MattDavey 提出的SuspendLayout-ResumeLayout 方法。
  • 这回答了这个问题。修复是SuspendLayout - ResumeLayout 方法。
  • 这不是问题的原因,原因是布局算法运行了数百次 - 这就是 SuspendLayout 修复问题的原因。如果重绘是导致 SuspendLayout 没有任何区别的原因(SuspendLayout 不会阻止控件重绘)。
猜你喜欢
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
  • 2017-06-25
相关资源
最近更新 更多