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


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

4 10

4 ответа:

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

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

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

        }


    }

}

Вот три скриншота элемента управления, измененного на различные ширины:

Три скриншота элемента управления изменили размеры на различные ширины

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

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

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