【发布时间】:2010-10-21 03:44:52
【问题描述】:
我有一个 Windows 窗体 (C# .NET 3.5),上面有许多按钮和其他控件,所有这些都分配给跨越整个窗体的最顶层面板。比如层次结构是:Form -> Panel -> 其他控件。
一旦我将 BackgroundImage 分配给 Panel,控件的绘制速度就会非常缓慢。如果我使用 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,但较小的图像具有相同的减速效果(虽然稍微小一些)。
我该怎么办?
【问题讨论】:
-
如果您使用的 VS 版本包含探查器,探查器说您将所有时间都花在了哪里?
标签: c# .net winforms performance