我有一个 TableLayoutPanel,它在 SplitterPanel 中包含动态数量的控件。用户可能希望调整面板大小以适应这些控件以避免使用滚动条。这会在容器大小调整以及容器内的控件上产生抖动。有时父容器在调整大小期间明显滞后于鼠标的移动(最多滞后 3 秒)。
有什么方法可以防止在父容器调整大小时重绘控件,例如在调整大小时隐藏所有元素或停止在鼠标拖动期间发生的调整大小事件,仅在 onMouseUp 事件上触发?
正如 Hans 评论的那样,SuspendLayout
和 ResumeLayout
以及暂停容器控件的绘制在这种情况下工作得很好:
public static class Win32 {
public const int WM_SETREDRAW = 0x0b;
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
public static void SuspendPainting(IntPtr hWnd) {
SendMessage(hWnd, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero);
}
public static void ResumePainting(IntPtr hWnd) {
SendMessage(hWnd, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero);
}
}
然后从你调整事件的大小:
private void Form1_ResizeBegin(object sender, EventArgs e) {
tableLayoutPanel1.SuspendLayout();
}
private void Form1_ResizeEnd(object sender, EventArgs e) {
Win32.SuspendPainting(tableLayoutPanel1.Handle);
tableLayoutPanel1.ResumeLayout();
Win32.ResumePainting(tableLayoutPanel1.Handle);
this.Refresh();
}
我是一名优秀的程序员,十分优秀!