C# 为什么在WinForm中隐藏控件要比使控件可见花费更长的时间?
我有一个包含56个复选框的C# 为什么在WinForm中隐藏控件要比使控件可见花费更长的时间?,c#,winforms,performance,C#,Winforms,Performance,我有一个包含56个复选框的FlowLayoutPanel。复选框用于三状态模式。现在是有趣的部分。如果复选框未勾选,则表示它们未被使用,可以隐藏以方便阅读。要隐藏它们,我使用另一个复选框。当用户单击复选框时,FlowPanel中所有未使用的复选框都将使用foreach迭代隐藏 问题是要隐藏它们,foreach调用(checkBox.Visible=false)大约需要2-3秒,而显示它们(checkBox.Visible=true)则需要0.5秒 关于为什么会发生这种情况,有什么建议吗 priv
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上隐藏(或显示)控件时,都会执行panels layouter算法,以便重新排列屏幕上的所有内容。例如,如果在一行中隐藏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。只是一个“元建议”:获取您选择的性能分析器(例如)并测量需要多长时间。我知道隐藏它们比显示它们需要更长的时间。您是否尝试过在
flowLayoutPanel
上调用和ResumeLayout
?@RobertIagar是的,这就是您在问题标题中已经说明的。我的建议是帮助你找出“为什么”。@Damien_是一个不信上帝的人,但这并不是问题的答案。这意味着如果我倒转(从底层乞讨),情况会有所改善吗?不确定。。。最好先试试MattDavey提出的SuspendLayout
-ResumeLayout
方法。这就回答了问题。修复方法是SuspendLayout
-ResumeLayout
方法。这不是问题的原因,原因是布局算法运行了数百次-这就是SuspendLayout修复问题的原因。如果重新绘制是导致SuspendLayout没有任何区别(SuspendLayout不会阻止控件重新绘制)。请看,我将此作为一条评论发布,因为它实际上并没有回答所提出的问题…@Damien_the_Noisever是的,很抱歉没有更早看到这一点。我重新选择了这个问题的答案。谢谢你的帮助。@RobertIagar我已经修改了答案,解释了为什么它运行缓慢。