我有一个Windows窗体(C# .NET 3.5),上面有许多按钮和其他控件,都分配给顶级面板,该面板跨越整个窗体。例如,层次结构如下:窗体→面板→其他控件。
一旦我为面板分配BackgroundImage,控件的绘制就会变得非常缓慢。如果我使用Form的BackgroundImage属性并将Panel的BackgroundColor设置为"透明",则会产生相同的效果。似乎首先绘制具有背景的窗口,然后每个控件逐个添加,并在绘制下一个控件之前稍微延迟。换句话说,您实际上可以按照每个控件绘制到窗体的顺序进行跟踪。一旦所有控件都被绘制一次,这种效果就不再发生了,但窗体的响应速度仍然很慢。
在Visual Studio的设计器中,我得到了相同的效果,尤其是在移动控件时更为明显。有时,窗体的绘图完全停止一两秒钟,这使得使用BackgroundImage非常麻烦,无论是在设计器中还是在最终应用程序中。
当然,我尝试了使用DoubleBuffered = true,并使用反射在所有控件上进行设置,但没有效果。
此外,这是窗体的加载代码,因为它有点不寻常。它将所有控件从另一个窗体复制到当前窗体。这样做是为了能够单独编辑每个屏幕的视觉外观,同时共享公共窗体和公共代码基础。我有一种预感,这可能是减速的原因,但仍无法解释为什么在设计器中已经注意到了减速。
private void LoadControls(Form form)
{
this.SuspendLayout();
this.DoubleBuffered = true;
EnableDoubleBuffering(this.Controls);
this.BackgroundImage = form.BackgroundImage;
this.BackColor = form.BackColor;
this.Controls.Clear();
foreach (Control c in form.Controls)
{
this.Controls.Add(c);
}
this.ResumeLayout();
}
正如你所看到的,SuspendLayout()
和 ResumeLayout()
用于避免不必要的重绘。
然而,一旦使用了 BackgroundImage,表单就会变得“慢得要死”。我甚至尝试将其转换为PNG、JPG和BMP格式,看看是否有任何区别。此外,图像大小为1024x768,但较小的图像也具有相同的减速效果(尽管略微减少)。
我该怎么办?