如何在不更新容器的情况下从容器中删除控件
本文关键字:删除 控件 情况下 更新 | 更新日期: 2023-09-27 18:04:47
我有一个普通的面板控件,其中包含一堆用户控件。目前,我做了以下操作:
panel.Controls.Clear();
,但我看到(虽然很快)每个控件单独消失的效果。
使用SuspendLayout
和ResumeLayout
没有明显的效果。
问题:是否有一种方法,我可以删除所有的控件,并有容器更新只有当所有的子控件已被删除?
编辑:我要删除的控件是从UserControl派生的,所以我有一些控制他们的绘图行为。是否有一些功能,我可以覆盖,以防止更新,因为他们被删除?谢谢Hans的建议-是的,原来我是泄漏控件。
我最后做的是:
panel.Visible = false;
while (panel.Controls.Count > 0)
{
panel.Controls[0].Dispose();
}
panel.Visible = true;
基本上,在我处置每个控件之前,我隐藏了整个面板(它是无边框的)。处理每个控件将自动从父容器中删除该控件,这很好。最后,我使容器再次可见。
我认为你需要的是双重缓冲。
关于这个问题已经有几个答案了,比如
Winforms双缓冲启用双缓冲
和
如何使用c# (Windows窗体)启用控件的双缓冲?
SuspendLayout
在子控件被移除时停止控件重绘,但是当您调用ResumeLayout
时,这些操作仍然按顺序处理。双缓冲将完全停止控件绘制,直到屏幕外缓冲区被更新。更新不会发生得更快,但它会从缓冲区一次呈现到屏幕上。如果你的机器很慢,你可能仍然会得到一个闪烁,当缓冲区呈现到屏幕上,就像你加载图片时。