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

本文关键字:窗体 调整 窗口 net 下拉列表 许多 控件 | 更新日期: 2023-09-27 18:19:49

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

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

这是表单的一般问题吗?这是使用.net组件和windows窗体的普遍缺点吗?

我没有处理控件调整大小的任何自定义事件,所以问题是关于微软开发的控件。我应该避免使用dock=fill吗?

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

在每次调整大小时,form都会形成调整大小table layout panel,强制调整大小并重新定位子控件(下拉菜单),这是正常的,因为设置了anchor属性。

有一个技巧可以避免在调整大小时给用户带来挫折:

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

具体示例如下:

在调整c#windows窗体的大小时防止重新绘制窗口

应该对你有用。

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();
        }
    }
}