防止重新调整Windows窗体的大小调整控件

我有一个TableLayoutPanel,它在SplitterPanel中包含动态数量的控件。 用户可能希望调整面板大小以适合这些控件以避免使用滚动条。 这会在容器resize以及容器内的控件上产生抖动。 有时,父容器在resize期间显着落后于鼠标移动(最多3秒滞后)。

是否有任何方法可以防止在父容器resize期间重新绘制控件,例如在resize期间隐藏所有元素或暂停在mousedrag期间发生的resize事件,仅在onMouseUp事件上触发?

正如Hans评论的那样, SuspendLayoutResumeLayout在这种情况下运行良好,同时暂停了容器控件的绘制:

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

然后从你resize事件:

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

对我而言,它使TableLayoutPanel成为双缓冲,然后我甚至不需要暂停布局。 我在这个post上找到了解决方案: 如何使用本网站的双缓冲TableLayoutPanel类在c#.net中的TableLayoutPanel中避免闪烁 : https : //www.richard-banks.org/2007/09/how-to-create -flicker-free.html

之后,我需要做的就是,在重建项目并重新启动Visual Studio几次(以使InitializeComponent()正常工作)之后,进入.Designer.cs文件并更改System.Windows.Forms.TableLayoutPanel class到新的DBLayoutPanel类。 要进入Designer文件并更改类,这有助于我节省时间,因为我已经在TableLayoutPanel中有很多控件。

您可以挂接父容器的resize事件并将e.Handled或e.Cancel属性设置为true,然后对onMouseUp进行手动重绘。