Пустое пространство в FlowLayoutPanel при развертывании формы

Я добавляю в свою основную форму UserControl со свойством Dock, установленным на Fill. UserControl имеет FlowLayoutPanel, который также закреплен (Fill), а для свойства AutoScroll установлено значение True.

FlowLayoutPanel содержит 5 групповых ящиков, каждый из которых имеет свой размер. Когда форма (или UserControl) имеет нормальный размер (716x520), групповые поля идут сверху вниз, все в порядке.

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

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


person Haytam    schedule 27.08.2016    source источник
comment
Когда вы увеличиваете форму, ваша панель тоже становится больше. Итак, FLP пересчитывает макет, и это то, что он придумал. Он не пытается решить печально известную проблему упаковки контейнеров, это NP-сложная проблема. Это нужно сделать быстрее, чем в мгновение ока. Особенность, а не ошибка.   -  person Hans Passant    schedule 27.08.2016
comment
Так есть ли решение этой проблемы, или я должен просто принять это?   -  person Haytam    schedule 27.08.2016


Ответы (1)


Очевидно, вы указываете LeftToRight для FlowDirection вместо TopDown. Итак, когда эта панель макета станет достаточно широкой, в первом ряду будет место для других групповых полей ...

Этот макет чем-то похож на перенос слов для текста, где вы получаете как можно больше слов в первой строке в зависимости от доступной ширины.

Поэтому, если вы измените направление, у вас будет один столбец, если у вас достаточно высоты.

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

Другой вариант - использовать раскладку на основе таблицы. Учитывая, что все поля вашей группы имеют одинаковую ширину, в этом нет необходимости (немного проще использовать схему потока, когда она работает).

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

person Phil1970    schedule 27.08.2016
comment
Ну, я только что сделал несколько тестов. Если вам нужен макет TopDown, тогда панель макета должна быть закреплена слева, но вы получите горизонтальную полосу прокрутки, если не все групповые поля могут поместиться. У вас есть В противном случае LeftToRight и Top стыковка вызовет ту же проблему, что и у вас изначально ... Таким образом, AutoSize и FlowDirection связаны, и вы не можете получить именно то, что, вероятно, хотите, без специального кода. - person Phil1970; 27.08.2016
comment
Я попробовал TopDown FlowDirection, но когда форма развернута и размер UserControl (и FLP) увеличен, достаточно, чтобы иметь 2 групповых ящика в одной строке, он показывает только 1 групповое поле на строку и полностью опускается. Есть ли способ показать им сверху вниз, когда он 716x520, но когда он достаточно большой, показать 2 групповых блока в строке, но без этих пробелов? - person Haytam; 27.08.2016
comment
Если макет TopDown, то высота контейнера фиксирована, а ширина регулируется. У вас не будет пробелов, потому что первый столбец заполняется сверху, затем второй и т. Д. Но поскольку изменяющимся размером является X, полоса прокрутки будет горизонтальной, если места недостаточно. Если вы хотите сначала заполнить строку, тогда все групповые поля должны иметь одинаковую высоту, чтобы избежать этого пространства. Поместите номер в заголовок групповых полей, и вам будет легко понять, как работает макет горячего потока. Если после того, как я попробовал варианты, которые я сказал, вы не можете получить то, что хотите, единственное решение - сделать свой собственный макет. - person Phil1970; 27.08.2016