当表单有许多下拉列表控件时,C#.net窗口窗体中的缓慢调整大小

时间:2012-01-06 20:00:46

标签: c# .net winforms

我创建了一个带有许多下拉列表的窗体,它放在一个网格(不是数据网格)中,当我在所有这些窗口中使用anchor = left right top bottom和dock = fill选项时,表单调整大小在运行时变慢。

停靠和锚点选项有什么问题?

这是形式的一般问题吗?使用.net组件和Windows窗体是否普遍存在缺点?

我没有在控件调整大小上处理任何自定义事件,因此问题在于Microsoft开发的控件。我应该避免使用dock = fill吗?

2 个答案:

答案 0 :(得分:10)

正如每次调整大小form形式调整大小table layout panel以强制调整大小和重新定位子控件(下拉列表)一样,消耗处理器是正常的,因为{ {1}}属性设置。

有一个技巧可以避免在调整大小时为用户造成挫折:

anchorSuspendLayout()事件处理程序上使用ResumeLayout()BeginResize()

在这里查看具体的例子:

Prevent window redraw when resizing c# windows forms

应该适合你。

答案 1 :(得分:1)

WinForms 绘图性能完全依赖于单线程的 CPU 处理器。这意味着如果您的表单绘制图片或任何其他复杂/众多的 UI 元素,您将面临几个性能问题。因此,您可能希望禁用不必要的重绘事件以优化整体性能。

下面的肮脏技巧将通过在表单中​​调整大小时禁用重绘来为您带来巨大的性能提升。下面的这段代码应该放在你表单的类中:

protected override void OnResize(EventArgs e)
{
    this.SuspendDrawing();
    base.OnResize(e);
    this.ResumeDrawing();
}

protected override void OnResizeBegin(EventArgs e)
{
    this.SuspendDrawing();
    base.OnResizeBegin(e);
}

protected override void OnResizeEnd(EventArgs e)
{
    base.OnResizeEnd(e);
    this.ResumeDrawing();
}

protected override void OnClosing(CancelEventArgs e)
{
    this.SuspendDrawing();
    base.OnClosing(e);
    this.ResumeDrawing();
}

这是完成所有技巧的扩展方法:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Example
{
    public static class ControlExtensions
    {
        [DllImport("user32.dll")]
        public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam);

        private const int WM_SETREDRAW = 11;

        public static void SuspendDrawing(this Control control) => SendMessage(control.Handle, WM_SETREDRAW, false, 0);

        public static void ResumeDrawing(this Control control)
        {
            SendMessage(control.Handle, WM_SETREDRAW, true, 0);
            control.Refresh();
        }
    }
}