c# - 防止在调整 Windows 窗体大小时重绘控件

标签 c# winforms vsto

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

有什么方法可以防止在父容器调整大小时重绘控件,例如在调整大小时隐藏所有元素或停止在鼠标拖动期间发生的调整大小事件,仅在 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);
  }
}

然后从你调整事件的大小:

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

关于c# - 防止在调整 Windows 窗体大小时重绘控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8929923/

相关文章:

c# - 如何在 Excel 中的 SheetChange 事件中确定新的和以前的单元格值?

c# - 从逗号分隔的字符串中查找特定字符串的最简单方法

c# - C# 中的通用消息传递模式

c# - 如何使用最少的重复代码编写异步类?

c# - 我如何遍历我拥有的所有组合框控件并将每个组合框的项目添加到列表中?

excel - 将选定范围从 Excel 粘贴到 Word 文档

c# - Hook 事件 Outlook VSTO 在主线程上继续工作

c# - 在流对象C#中使用GetStream方法

c# - 如何将列表转换为数据表

c# - C# WinForms 中 ListView 第一列中的图像