Запретить перерисовку элементов управления при изменении размера для Windows Forms - PullRequest
1 голос
/ 19 января 2012

У меня есть TableLayoutPanel, которая содержит динамическое количество элементов управления внутри SplitterPanel. Пользователь может захотеть изменить размер панели, чтобы соответствовать этим элементам управления, чтобы избежать использования полосы прокрутки. Это создает джиттер при изменении размера контейнера, а также элементы управления внутри контейнера. Иногда родительский контейнер значительно отстает от движения мыши во время изменения размера (до 3 секунд).

Есть ли способ предотвратить перерисовку элементов управления во время изменения размера родительского контейнера, например скрыть все элементы во время изменения размера или остановить событие изменения размера, которое происходит во время mousedrag, вызывая только событие onMouseUp?

Ответы [ 3 ]

3 голосов
/ 19 января 2012

Как прокомментировал Ханс, 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();
}
1 голос
/ 09 июня 2017

Для меня это хорошо сработало с двойной буферизацией TableLayoutPanel, тогда мне даже не нужно было приостанавливать компоновку.Я нашел решение в этой теме: Как избежать мерцания в 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 на новый класс DBLayoutPanel.Переход внутрь файла Designer и изменение класса помогли мне сэкономить время, потому что у меня уже было много элементов управления внутри TableLayoutPanel.

0 голосов
/ 19 января 2012

Вы можете подключить событие resize вашего родительского контейнера и установить для свойства e.Handled или e.Cancel значение true, а затем выполнить перерисовку вручную для onMouseUp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...