相关疑难解决方法(0)

如何为控件及其子项暂停绘画?

我有一个控件,我必须做大量修改.当我这样做时,我想完全阻止它重绘 - SuspendLayout和ResumeLayout是不够的.如何为控件及其子项暂停绘画?

.net c# paint winforms

179
推荐指数
6
解决办法
10万
查看次数

Windows窗体:使用BackgroundImage会减慢窗体控件的绘制速度

我有一个Windows窗体(C#.NET 3.5),上面有许多按钮和其他控件,都分配给一个跨越整个窗体的最顶层面板.例如,层次结构为:Form - > Panel - >其他控件.

一旦我将BackgroundImage分配给Panel,控件就会非常缓慢地绘制.如果我使用Form的BackgroundImage属性并将Panel的BackgroundColor设置为"transparent",我会有同样的效果.看起来好像首先绘制了具有背景的窗口,然后在绘制下一个控件之前稍微延迟逐个添加每个控件.换句话说,您实际上可以按照每个控件绘制到窗体的顺序.一旦所有控件都被绘制,一旦此效果不再发生,但表单的响应速度仍然很慢.

在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();
}
Run Code Online (Sandbox Code Playgroud)

如您所见,SuspendLayout()ResumeLayout()用于避免不必要的重绘.

尽管如此,一旦使用BackgroundImage,表单就像"地狱一样慢".我甚至尝试将其转换为PNG,JPG和BMP,看看是否有任何区别.此外,图像尺寸为1024x768,但较小的图像具有相同的减速效果(尽管略小).

我该怎么办?

.net c# performance winforms

27
推荐指数
2
解决办法
3万
查看次数

我是否需要为每个儿童控制调用SuspendLayout?

找不到任何相关信息.我的控件渲染速度非常慢,我注意到SuspendLayout在进行重大更新时我没有打电话.

我有点怀疑,因为顶级控件包含包含其他控件的控件等等,调用SuspendLayout我的顶级控件也会挂起每个嵌套控件的布局,还是我需要为每个控件调用它?

c# winforms

14
推荐指数
1
解决办法
8118
查看次数

标签 统计

c# ×3

winforms ×3

.net ×2

paint ×1

performance ×1