Как заставить FlowLayoutPanel.AutoSize работать с FlowBreak

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

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

введите здесь описание изображения

Свойства дочернего элемента FlowLayoutPanel:

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

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

введите здесь описание изображения

Изменение 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;

person Natalia    schedule 25.03.2013    source источник
comment
это проблема в моем графическом интерфейсе с одним элементом управления docs.google.com /document/d/, когда я помещаю 2 элемента управления и устанавливаю для FlowBrake значение True docs.google.com/document/d/ Я хочу, чтобы элементы управления оставались поднятыми, но изменение ширины не подходит.   -  person Natalia    schedule 26.03.2013
comment
Не могли бы вы добавить два изображения - одно с тем, что у вас есть, а другое с тем, чего вы пытаетесь достичь. Из текстового описания непонятно, с какой проблемой вы столкнулись.   -  person Sergey Berezovskiy    schedule 03.04.2013
comment
Я добавил новое изображение с результатом, а в своем предыдущем комментарии я поставил две ссылки с поведением в моем графическом интерфейсе.   -  person Natalia    schedule 03.04.2013
comment
Почему изменить направление на TopDown нельзя?   -  person Neolisk    schedule 03.04.2013
comment
TL;DR версия вопроса Why with AutoSize there is enough space on the right of a layout panel reserved as if it was going to fit the biggest of all existing buttons there?   -  person Neolisk    schedule 03.04.2013
comment
@Neolisk, если я изменю направление на TopDown, тогда, если я хочу расположить все элементы управления горизонтально, я должен поместить FlowBrake во все из них, а height из FlowLayoutPanel тогда будет больше.   -  person Natalia    schedule 03.04.2013
comment
@Natalia: Итак, вы получаете ту же проблему, перевернутую на 90 градусов. Хорошо, я вижу это... интересно... Мне кажется, это ошибка в FlowLayoutPanel.   -  person Neolisk    schedule 03.04.2013


Ответы (3)


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

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

person Hans Passant    schedule 03.04.2013
comment
Спас мой день.. Спасибо!! - person vendettamit; 31.05.2017

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

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

введите здесь описание изображения

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

person Michael G    schedule 03.04.2013
comment
Те же мысли, в то же время. Голосование... :) - person Neolisk; 03.04.2013
comment
Ваш hackish work around потрясающий. Я тоже пытался найти такой, но панель управления не пришла мне в голову. Хотел бы я дать вам еще один голос за это. - person Neolisk; 03.04.2013

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

person Neolisk    schedule 03.04.2013
comment
В моем графическом интерфейсе пользователь может настроить порядок и положение любой кнопки. пользователь также может перетаскивать кнопку в контейнер и из него. если я создаю панель макета таблицы, то, когда пользователь теряет контроль над этим, поведение таблицы не является тривиальным, потому что у нас может быть столбец управления, строка или таблица. - person Natalia; 03.04.2013
comment
@Natalia: вы пытаетесь реализовать это? - person Neolisk; 03.04.2013