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