Как эффективно расположить элементы управления внутри прокручиваемой панели (C # Windows Forms), чтобы избежать мерцания пользовательского интерфейса - PullRequest
0 голосов
/ 12 ноября 2018

Я построил специальную панель (используя Add-in Express для MS Office), основанную на обычной прокручиваемой панели. Элементы управления размечаются с использованием метода, вызываемого из обработчиков событий Resize / FontChanged. Все элементы управления имеют Anchor = Left + Top. Сама панель имеет AutoScroll = True для отображения полос прокрутки, если элементы управления не помещаются на панели.

Я обнаружил, что в некоторых случаях событие Resize должно срабатывать несколько раз во время операции макета, даже если я использую вызовы SuspendLayout / ResumeLayout. Это происходит 1), если элементы управления помещаются в панель до операции макета, но не помещаются в нее после этой операции, и 2) если элементы управления не находятся в панели до операции макета, но помещаются в нее после операции. В этих случаях вертикальная полоса прокрутки появляется или исчезает, вызывая событие Resize. Когда это происходит, мой код в методе макета изменяет ширину всех элементов управления для учета появления / исчезновения полосы прокрутки (поскольку их ширина зависит от ClientSize.Width и ClientSize.Width зависит от наличия вертикальной полосы прокрутки). Поэтому общая высота элементов управления на панели изменяется. Поскольку размеры элементов управления изменяются несколько раз, есть мерцание пользовательского интерфейса, которого я хочу избежать.

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

Очевидно, что двойная буферизация здесь неактуальна, потому что я не занимаюсь ничьей (а я уже пробовал). Я пытался SuspendLayout / ResumeLayout, но это не помогает здесь. Я слышал рекомендации по скрытию элементов управления в начале изменения размера и отображению их после изменения размера. Я пробовал это, но элементы управления появляются на экране с видимой задержкой около полсекунды, что даже хуже, чем мерцание пользовательского интерфейса. Другая альтернатива, которую я вижу, состоит в том, чтобы заставить панель сообщать свой ClientSize.Width с полосой прокрутки и без нее, затем прогнозировать высоту элементов управления на панели и, наконец, устанавливать ширину элементов управления в зависимости от этого прогноза. В этом случае появление / исчезновение полосы прокрутки не приведет к другому изменению размера. Однако трудно предсказать высоту всех элементов управления без предварительной установки их ширины (например, метки с MaximumSize = {width, 0} будут иметь переменную высоту).

Я прошу любую помощь. Спасибо!

С уважением, Станислав

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