Как получить FlowLayoutPanel.AutoSize для работы с FlowBreak

У меня проблема с FlowLayoutPanel, и я не знаю, как ее решить.

Я помещаю две FlowLayoutPanels внутри другой; второй внутренний flp имеет 3 кнопки внутри.

enter image description here

Свойства из потока FlowLayoutPanel:

FlowDirection = LeftToRight;
AutoSize = true;
AutoSizeMode = GrowAndShrink;
WrapContents = true;

Теперь я устанавливаю для каждой кнопки свойство FlowBreak значение true, однако поведение, которое я вижу, не тот, который я хочу, я хочу, чтобы FlowLayoutPanel уменьшалась до ширины кнопок,

enter image description here

Изменение FlowDirection до UpToDown не является опцией.

Кто-нибудь знает, почему AutoSize не работает?

это код.

//
//FlowLayoutPanel1
//
this.FlowLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.FlowLayoutPanel1.Controls.Add(this.FlowLayoutPanel3);
this.FlowLayoutPanel1.Location = new System.Drawing.Point(84, 77);
this.FlowLayoutPanel1.MinimumSize = new System.Drawing.Size(10, 10);
this.FlowLayoutPanel1.Name = "FlowLayoutPanel1";
this.FlowLayoutPanel1.Size = new System.Drawing.Size(308, 265);
this.FlowLayoutPanel1.TabIndex = 0;
//
//FlowLayoutPanel3
//
this.FlowLayoutPanel3.AutoSize = true;
this.FlowLayoutPanel3.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.FlowLayoutPanel3.Controls.Add(this.Button1);
this.FlowLayoutPanel3.Controls.Add(this.Button2);
this.FlowLayoutPanel3.Controls.Add(this.Button3);
this.FlowLayoutPanel3.Location = new System.Drawing.Point(127, 3);
this.FlowLayoutPanel3.MinimumSize = new System.Drawing.Size(10, 10);
this.FlowLayoutPanel3.Name = "FlowLayoutPanel3";
this.FlowLayoutPanel3.Size = new System.Drawing.Size(162, 87);
this.FlowLayoutPanel3.TabIndex = 1;
//
//Button1
//
this.FlowLayoutPanel3.SetFlowBreak(this.Button1, true);
this.Button1.Location = new System.Drawing.Point(3, 3);
this.Button1.Name = "Button1";
this.Button1.Size = new System.Drawing.Size(75, 23);
this.Button1.TabIndex = 0;
this.Button1.Text = "Button1";
this.Button1.UseVisualStyleBackColor = true;
//
//Button2
//
this.FlowLayoutPanel3.SetFlowBreak(this.Button2, true);
this.Button2.Location = new System.Drawing.Point(3, 32);
this.Button2.Name = "Button2";
this.Button2.Size = new System.Drawing.Size(75, 23);
this.Button2.TabIndex = 1;
this.Button2.Text = "Button2";
this.Button2.UseVisualStyleBackColor = true;
//
//Button3
//
this.Button3.Location = new System.Drawing.Point(3, 61);
this.Button3.Name = "Button3";
this.Button3.Size = new System.Drawing.Size(75, 23);
this.Button3.TabIndex = 2;
this.Button3.Text = "Button3";
this.Button3.UseVisualStyleBackColor = true;

Ответ 1

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

Обходной путь глупый, но эффективный, добавьте фиктивную панель с шириной 0 после первого элемента управления. Если вы делаете это с дизайнером, сначала отбросьте его и перетащите в нужное место справа от 1-го элемента управления. Затем установите его маржу в (0, 0, 0, 0) и Size to (0, 0) в окне "Свойства".

Ответ 2

Я не считаю, что FlowLayoutPanel был разработан, чтобы делать то, что вы пытаетесь сделать. Возможно, TableLayoutPanel лучше подходит. Добавьте таблицу TableLayoutPanel с одним столбцом и добавьте каждую кнопку в строку.

Изменить. Я нашел хакерскую работу. После первой кнопки создайте Panel с размером 0,0 и маржей 0,0. Убедитесь, что для параметра FlowBreak установлено значение false.

enter image description here

Изменить: Вам нужно создать только одну панель, после первой кнопки, а не по одному для каждого.

Ответ 3

Не решение, а обходное решение. Похоже, вы пытаетесь моделировать поведение TableLayoutPanel, используя разрывы потока в FlowLayoutPanel. Вы пытались использовать TableLayoutPanel вместо этого? Согласно вашим снимкам экрана в комментариях, он должен отлично работать для ваших нужд.