Как я могу остановить перерисовку родительского элемента управления в строке перед перерисовкой его дочернего элемента управления? - PullRequest
0 голосов
/ 14 декабря 2011

Я создаю пользовательский элемент управления с собственным набором заголовков.

Заголовки (другой пользовательский элемент управления) существуют как дочерний элемент управления вышеупомянутого пользовательского элемента управления.

Когда я изменяю размер заголовков (часть дочернего элемента управления), дочерний контроллер вызывает для себя функцию Invalidate (), которая должна поставить в очередь сообщение для перерисовки.

После того, как дочерний контроллер был признан недействительным, родительский элемент управления получает уведомление о том, что размер заголовка изменился, и выдает собственную команду Invalidate ().

Это показано этим следом:

Headers.Invalidate ()
List.Invalidate ()
Headers.Invalidate ()
List.Invalidate ()

Однако, когда приходит время начать перерисовку, родительский элемент управления сначала получает событие Paint, а затем элемент управления заголовком:

List.Paint
Заголовки. Раскраска

Когда я быстро перемещаю мышь, события перемещения мыши оказываются в очереди перед событиями рисования, поэтому недействительные продолжают вызываться, но события рисования родительского элемента управления всегда запускаются первыми:

List.Paint
List.Paint
List.Paint
List.Paint
Headers.Paint
List.Paint
List.Paint
Заголовки. Раскраска

Это заставляет элемент управления заголовка существенно отставать от списка. В идеале оба события рисования должны запускаться вместе, и все события перемещения мыши ставятся в очередь перед событиями рисования (так что рисование всегда синхронизировано, но все события мыши сбрасываются между красками.)

Понятия не имею, с чего начать исправление этой проблемы.

С чего начать, чтобы исправить отставание, которое испытывает мой заголовок?

Ответы [ 2 ]

1 голос
/ 15 декабря 2011

Ответ заключается в том, чтобы сделать перерисовку синхронной путем рисования вручную, используя методы Update или Refresh.

Метод Update просто перекрасит элементы управления и все дочерние элементы синхронно.

Метод Refresh сделает недействительным элемент управления и все дочерние элементы, а затем вызовет Update.

0 голосов
/ 14 декабря 2011

вы уже используете двойную буферизацию? Это может быть медленнее, но оно должно синхронизировать перерисовки, чтобы оба обновления обновлялись при обновлении.

Вы можете включить двойную буферизацию в форме с помощью:

SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

Также вы можете попробовать:

    SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
    SetStyle(ControlStyles.Opaque, true);
    SetStyle(ControlStyles.SupportsTransparentBackColor, false);
...