Я построил специальную панель (используя 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} будут иметь переменную высоту).
Я прошу любую помощь. Спасибо!
С уважением,
Станислав