Полоса прокрутки не отображается в родительском элементе управления, если дочерний элемент привязан к краю

#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 или правильную комбинацию якорей.