#c# #winforms #layout
#c# #winforms #макет
Вопрос:
Интересно, почему дочерний элемент управления нельзя прокручивать, даже если он не может поместиться в его контейнер. Вот мой простой пример макета:
У меня есть оранжевая панель и зеленая панель внутри. Для оранжевой панели установлена функция автоматической прокрутки true. Зеленая панель прикреплена сверху и имеет минимальную ширину = 150. Почему горизонтальная полоса прокрутки не отображается на оранжевой панели?
Без DockStyle=Top все работает нормально. Я мог бы использовать привязки, но мне удобнее закреплять при создании более сложных макетов со множеством групповых блоков и панелей, наложенных друг на друга. Мне также не нравится использовать AutoScrollMinSize, потому что он устанавливает ограничение независимо от того, какие элементы управления в данный момент видны в форме.
Вопрос в том, почему это работает таким образом?
P.S. Просто дайте мне знать, если это сделано специально и нет другого способа, кроме привязок на зеленой панели или автоматического увеличения размера на оранжевой панели. Мне кажется странным, что в этом случае он не может отображать полосу прокрутки, даже если у вас есть дочерний элемент управления, который не может поместиться в родительский элемент управления, а родительский элемент имеет AutoScroll = true. Я предполагаю, что механизм компоновки даже не утруждает себя вычислением фактической ширины закрепленного элемента управления, потому что теоретически он растягивается до любой родительской ширины, которая у вас есть.
Комментарии:
1. зеленый находится внутри оранжевого?
2. да, зеленая панель находится внутри оранжевой панели.
3. и больше ничего в форме?
4. больше ничего. Это тестовый проект, в котором я воспроизвел это поведение, есть только две панели.
5. Похоже, что так задумано.
Ответ №1:
Похоже, что это сделано специально. Я проверил код ScrollableControl, от которого унаследована Panel и, следовательно, другие контейнеры, такие как TableLayoutPanel и FlowLayoutPanel. Горизонтальная полоса прокрутки не будет проверяться, если дочерний элемент управления имеет:
Dock=Top|Bottom|Fill|Right or Anchor=Right or Anchor!=Left
И такая же картина для вертикальной полосы прокрутки, она игнорируется, когда дочерний элемент управления имеет:
Dock=Left|Bottom|Fill|Right or Anchor=Bottom or Anchor!=Top
Я ничего особенного не могу сделать, кроме как использовать AutoScrollMinSize или правильную комбинацию якорей.