С#: Как получить пользовательский элемент управления для собственно автоматического размера
У меня есть UserControl
, который состоит из Label
(Top), a FlowLayoutPanel
(Fill, TopDown flow и no wrap) и Panel
(Bottom). Пользовательский элемент управления создает несколько элементов управления на основе списка вещей, которые он получает, и добавляет их в FlowLayoutPanel
.
Как я могу заставить этот UserControl
правильно изменить размер, чтобы FlowLayoutPanel
не имел полос прокрутки? Я попытался использовать различные комбинации AutoSize
и AutoSizeMode
на FlowLayoutPanel
и UserControl
, но я не могу заставить его работать. Либо я заканчиваю тем, что вообще не изменяет размер, или оно не становится достаточно большим, или оно сжимается почти до нуля.
Ответы
Ответ 1
Спасибо за все предложения. Решение на этот раз показало, что AutoSize
- true
для FlowLayoutPanel
и UserControl
.
Теперь, как получить форму, которая будет содержать этот UserControl
, а также некоторые другие элементы управления, которые я пока не могу понять, но я думаю, что это должен быть отдельный вопрос...
Ответ 2
Вы можете использовать свойство Anchor- и Dock для UserControl для установки параметров, чтобы края вашего элемента управления были "склеены" с некоторыми другими частями вашего пользовательского интерфейса. Когда пользовательский интерфейс будет изменен, ваш контроль будет следовать!
Если вы используете привязки и док-станцию для всех элементов управления в пользовательском элементе управления и устанавливаете их для стыковки краев элемента управления, элементы управления будут изменять размер с помощью UserControl, и теперь вы также можете установить привязки/док-станцию в UserControl.
Ответ 3
Обтекание FlowLayoutPanel
в TableLayoutPanel
позволит обеспечить правильное поведение по умолчанию.
Ваш UserControl
должен выглядеть следующим образом:
UserControl
TableLayoutPanel (Dock-Fill)
Row1 : Label
Row2 : FlowLayoutPanel (Panel:Dock-Fill AND AutoSize, Row:AutoSize)
Row3 : Panel
Опять же, при использовании этого UserControl
возможно, вам нужно будет обернуть его в TableLayoutPanel
, используя строку или столбец AutoSize
.
Следите за SplitContainers
, так как они часто выходят из равновесия автоматически.
Ответ 4
Я обнаружил, что лучший способ решить это - использовать некоторый код в событии ControlAdded на панели flowlayout, чтобы настроить высоту панели (высота, потому что вы использовали поток TopDown):
e.Control.Location.Y + e.Control.Height + some margin
и установить для свойства AutoSize для самого пользовательского контроля значение True.
Вам также необходимо выполнить некоторые рекомендации по стыковке и закреплению в соответствии с ответом Микеля.
Эта функциональность может быть инкапсулирована в ваш собственный элемент управления, унаследованный от FlowLayoutPanel и переопределяющий метод ControlAdded.
Ответ 5
При добавлении элемента управления в flowlayout вы можете изменить размер уже добавленных элементов управления до требуемого размера, не получая полосы прокрутки для панели раскладки потока.