Groupbox с панелью flowlayout внутри и autosize = true сжимается, как и пустая

У меня есть групповой ящик, который содержит панель flowlayout, а панель flowlayout содержит кучу элементов управления. Я установил панель flowlayout для стыковки с родителем. Поскольку я не знаю, сколько элементов управления будет в панели, я устанавливаю групповое поле autosize в true и autosizemode, чтобы расти и сокращаться. Когда я это делаю, групповой ящик сжимается, как будто он пуст. Мне нужна подпись, поэтому я не могу удалить групповой пакет. Кто-нибудь знает, почему это происходит?

Ответ 1

Нет ничего, что останавливает FlowLayoutPanel от сжатия до нуля. Вам, по крайней мере, придется установить свойство AutoSize на True.

Ответ 2

Я пытался сделать то же самое сегодня. Ниже приведено решение, которое должно выполнить док-станцию ​​FlowLayoutPanel внутри GroupBox, а затем использовать события Resize и ControlAdded для FlowLayoutPanel, чтобы вызвать изменение размера родительского GroupBox.

Обработчик размера находит нижнюю часть последних элементов управления в FlowLayoutPanel и изменяет размер GroupBox с достаточным пространством, чтобы удерживать самый нижний элемент управления в FlowLayoutPanel.

Я попытался использовать AutoSize = true в FlowLayoutPanel и GroupPanel. Но, к сожалению, это позволяет FlowLayoutPanel расти горизонтально.

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();

        int numGroupBoxes = 4;

        for (int groupBoxIndex=0; groupBoxIndex<numGroupBoxes; groupBoxIndex++ )
        {
            GroupBox groupBox = new GroupBox();
            groupBox.Text = "Group " + groupBoxIndex;
            groupBox.Size = new Size(this.Width, 0);
            groupBox.Dock = DockStyle.Top;
            this.Controls.Add(groupBox);

            FlowLayoutPanel groupBoxFlowLayout = new FlowLayoutPanel();
            groupBoxFlowLayout.Dock = DockStyle.Fill;
            groupBox.Controls.Add(groupBoxFlowLayout);

            int extraSpace = 25; // the difference in height between the groupbox and the contents inside of it

            MethodInvoker resizeGroupBox = (() =>
            {
                int numControls = groupBoxFlowLayout.Controls.Count;
                if ( numControls > 0 )
                {
                    Control lastControl = groupBoxFlowLayout.Controls[numControls - 1];
                    int bottom = lastControl.Bounds.Bottom;
                    groupBox.Size = new Size(groupBox.Width, bottom + extraSpace);
                    groupBoxFlowLayout.Size = new Size(groupBoxFlowLayout.Width, bottom);
                }
            });

            groupBoxFlowLayout.Resize += ((s, e) => resizeGroupBox());
            groupBoxFlowLayout.ControlAdded += ((s, e) => resizeGroupBox());

            // Populate each flow panel with a different number of buttons
            int numButtonsInGroupBox = 3 * (groupBoxIndex+1);
            for (int buttonIndex = 0; buttonIndex < numButtonsInGroupBox; buttonIndex++)
            {
                Button button = new Button();
                button.Margin = new Padding(0, 0, 0, 0);
                string buttonText = buttonIndex.ToString();
                button.Text = buttonText;
                button.Size = new Size(0,0);
                button.AutoSize = true;
                groupBoxFlowLayout.Controls.Add(button);
            }

        }


    }

}

Вот три скриншота управления, размер которых изменен до разных разностей:

Three screenshats of the control resized to various different widths

Ответ 3

Вы указываете: "Я не знаю, сколько элементов управления будет в панели". Есть ли у вас элементы управления FlowLayoutPanel во время разработки? Если вы этого не сделаете, это звучит как ожидаемое поведение. У панели нет ничего, поэтому желаемый размер равен нулю, поэтому нужный размер GroupBox равен нулю.

Если это так, тогда все должно надеяться на размер, когда вы фактически добавляете элементы управления во время выполнения.

Ответ 4

Вы задаете свойства Якорь: Верх, Нижний, Слева, Вправо для groupBox.