我创建了一个带有许多下拉列表的窗体,它放在一个网格(不是数据网格)中,当我在所有这些窗口中使用anchor = left right top bottom和dock = fill选项时,表单调整大小在运行时变慢。
停靠和锚点选项有什么问题?
这是形式的一般问题吗?使用.net组件和Windows窗体是否普遍存在缺点?
我没有在控件调整大小上处理任何自定义事件,因此问题在于Microsoft开发的控件。我应该避免使用dock = fill吗?
答案 0 :(得分:10)
正如每次调整大小form
形式调整大小table layout panel
以强制调整大小和重新定位子控件(下拉列表)一样,消耗处理器是正常的,因为{ {1}}属性设置。
有一个技巧可以避免在调整大小时为用户造成挫折:
在anchor
和SuspendLayout()
事件处理程序上使用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();
}
}
}