Подтвердить что ты не робот

С#: Как получить пользовательский элемент управления для собственно автоматического размера

У меня есть UserControl, который состоит из Label (Top), a FlowLayoutPanel (Fill, TopDown flow и no wrap) и Panel (Bottom). Пользовательский элемент управления создает несколько элементов управления на основе списка вещей, которые он получает, и добавляет их в FlowLayoutPanel.

Как я могу заставить этот UserControl правильно изменить размер, чтобы FlowLayoutPanel не имел полос прокрутки? Я попытался использовать различные комбинации AutoSize и AutoSizeMode на FlowLayoutPanel и UserControl, но я не могу заставить его работать. Либо я заканчиваю тем, что вообще не изменяет размер, или оно не становится достаточно большим, или оно сжимается почти до нуля.

4b9b3361

Ответ 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 вы можете изменить размер уже добавленных элементов управления до требуемого размера, не получая полосы прокрутки для панели раскладки потока.