Если вы создадите панель в форме и установите для нее значение Dock = Top, а другую панель и установите для нее Dock = Fill, она может заполнить всю форму, игнорируя первую панель. Изменение порядка табуляции ничего не дает.





Щелкните правой кнопкой мыши панель с Dock = Fill и выберите «На передний план».
Это делает этот элемент управления последним, что учитывает настройки Dock для других элементов управления в том же контейнере.
Обретает смысл, если подумать.
Другой, потенциально более чистый вариант - использовать элемент управления TableLayout. Установите один ряд желаемой высоты для верхней док-станции и другой ряд, чтобы заполнить на 100% нижнюю часть. Установите обе панели внутри на Заливку, и все готово.
(Однако к TableLayout нужно привыкнуть.)
TableLayout также медленнее, чем стыковка conterols для производительности макета, особенно если у вас есть вложенные пользовательские элементы управления, которые используют TableLayout. Тем не менее, он дает хороший макет, чтобы быть уверенным.
Уменьшает ли эта производительность то, что средний пользователь увидел бы в простом случае двух панелей, как описано выше? Или это то, что они замечают, когда у вас есть десятки объединенных коммуникаций, все с макетами, все в одном макете? (По иронии судьбы, приложение, над которым я сейчас работаю, похоже на это, и производительность кажется нормальной ...)
TableLayout довольно легкий. Вы не увидите проблем с производительностью, если просто разместите несколько элементов управления.
Вот трюк, который у меня сработал ...
Поместите верхний элемент и закрепите его сверху.
Поместите сплиттер, а также закрепите его сверху, затем отключите его (если вы не хотите изменить размер верха).
Затем поместите объект «Заливка» и установите для «Закрепление» значение «Заливка». Объект останется ниже разделителя.
Макет закрепления зависит от приказ родственных элементов управления. Элементы управления закреплены «на кнопке вверх», поэтому последний элемент в коллекции закрепляется первым. Пристыкованный элемент управления учитывает только расположение пристыкованных братьев и сестер ранее. Следовательно, элемент управления с Dock = Fill должен быть первым (вверху) в соседнем порядке, если вы хотите, чтобы он учитывал другие закрепленные элементы управления. Если это не первый элемент управления, предыдущие элементы управления будут перекрывать его.
Это может сбивать с толку, потому что родственный порядок не обязательно совпадает с визуальным порядком, а родственный порядок не всегда очевиден из представления дизайна.
Окно Схема документа (Вид -> Другие окна -> Структура документа) дает полезное древовидное представление иерархии и порядка элементов управления, а также позволяет изменять порядок элементов элементов управления.
Вы также можете изменить порядок братьев и сестер прямо в дизайнере с помощью контекстного меню -> На передний план / На задний план, которое перемещает элемент управления в положение первого или последнего из братьев и сестер. Эти метки меню могут несколько сбивать с толку, поскольку фактический эффект зависит от модели макета.
При фиксированном позиционировании элементов управления 2D-положение не зависит от порядка соседних элементов, но при наложении элементов управления самый ранний элемент управления в порядке будет «наверху», скрывая часть элементов-элементов позже в порядке. В этом контексте имеет смысл Перенести на передний план / Отправить на задний план.
Внутри панелей потокового или табличного макета порядок создания определяет визуальный порядок элементов управления. Нет дублирующих элементов управления. Таким образом, переместить на передний план / отправить назад на самом деле означает сделать первым или последним в порядке элементов управления.
При закрепленном макете перенос на передний план / отправка на задний план может быть еще более запутанным, поскольку он определяет, в каком порядке вычисляется стыковка, поэтому "перенос на передний план" для закрепленного элемента управления помещает элемент управления в середина родительского элемента. с учетом всех элементов управления, закрепленных за ребром.
У меня есть панель, полоса состояния и полоса меню в форме, и кажется, что когда я закрепляю полоску меню вверху, полоску статуса внизу и заполняю панель, панель не заполняет пространство между две полосы, если это не первый брат (вверху окна структуры документа над двумя полосами). Перемещение панели вниз (в сторону «последней») закрывает полосы. Итак, должен ли элемент управления Dock = Fill быть первым в этом порядке? Я неправильно это читаю? я использую 3.5 (2008). Это изменилось?
tl; dr; Щелкните правой кнопкой мыши панель с Dock = Fill и выберите «На передний план».
У меня есть 3 групповых ящика внутри панели, и, как и @Jugglingnutcase, я должен был их упорядочить, например: Dock.Fill, затем Dock.Bottom и, наконец, Dock.Top, чтобы они 3 правильно пристыковались. В любом случае классный пост!
+1 для окна структуры документа. Никогда не знал, что это существует, но это так полезно.
Как я могу сделать это программно? Я имею в виду, что я добавляю элементы управления динамически, поэтому я не могу использовать для этого конструктор.
@Camilo: если вы добавляете элементы управления динамически, вы должны добавлять их в желаемом порядке.
@JacquesB Значит, кроме добавления их в том порядке, в котором я хочу, нет никакого способа изменить их порядок позже, верно? Не считая удаления их всех и повторного добавления их заново.
Я думаю, вы можете изменить порядок коллекции элементов управления, удалив элементы управления и снова вставив их по определенным индексам. Но вам, наверное, стоит задать об этом отдельный вопрос, так как я не уверен.
Согласитесь с @gligoran - понятия не имел, что такое существует, это круто!
@JacquesB: Я могу подтвердить наряду с другими комментариями и ответами, что решение состоит в том, чтобы поместить элемент управления Dock = Fill первый в родственный порядок в структуре документа, а не последним, как описано в ответе. Хотели бы вы отредактировать ответ, чтобы исправить это? Или я был бы рад внести правку, но я не хочу быть самонадеянным. Спасибо!
Спасибо, это действительно полезно.
+1: Я не могу поверить, сколько времени я потерял, пытаясь понять это! Почему, черт возьми, это не документировано лучше?
У JacquesB была идея с планом документа, но иерархия не решила мою проблему. Мои элементы управления не были в иерархическом стиле, они просто были перечислены с одним и тем же родителем.
Я узнал, что если вы измените порядок, он будет выглядеть так, как вы хотите.
Элементы управления в нижней части списка будут перекрывать элементы управления в верхней части окна «Структура документа». В вашем случае вы должны убедиться, что первая панель находится под второй панелью и так далее.
У меня была такая же проблема, и мне удалось ее решить.
Если у вас есть контейнер с DockStyle.Fill, у других также должен быть DockStyle, но Top или что угодно.
Важно сначала добавить элемент управления с DockStyle.Fill в Controls, а затем остальные.
Пример:
ComboBox cb = new ComboBox();
cb.Dock = DockStyle.Top;
GridView gv = new GridView();
gv.Dock = DockStyle.Fill;
Controls.Add(gv); // this is okay
Controls.Add(cb);
но если сначала поставить cb
Controls.Add(cb);
Controls.Add(gv); // gv will overlap the combo box.
Если вы не хотите изменять порядок элементов внутри кода, вы можете использовать метод Container.Controls.SetChildIndex () с Container, например, Форма, панель и т. д., В которые вы хотите добавить свои элементы управления.
Пример:
//Container ------------------------------------
Panel Container = new Panel();
//Top-Docked Element ---------------------------
ButtonArea = new FlowLayoutPanel();
Container.Controls.Add(ButtonArea);
Container.Controls.SetChildIndex(ButtonArea, 1);
ButtonArea.Dock = DockStyle.Top;
//Fill-Docked Element --------------------------
box = new RichTextBox();
Container.Controls.Add(box);
Container.Controls.SetChildIndex(box, 0); //setting this to 0 does the trick
box.Dock = DockStyle.Fill;
Я столкнулся с той же проблемой. Моя была с добавлением новых / настраиваемых элементов управления под полосой меню во время выполнения. Проблема заключалась в том, что элементы управления пристыкованы, решено закрепить сверху формы и полностью игнорировать полосу меню, что очень раздражает, если вы спросите меня. Поскольку это нужно было делать динамически с кодом, а не в режиме разработки, это сильно расстраивало. Самый простой способ, который я нашел, - создать панель в режиме дизайна и закрепить ее под полосой меню. Оттуда вы можете просто добавить / удалить элементы управления на панель, и вы можете закрепить ее во время выполнения. Не нужно возиться со всеми вашими элементами управления в вашей форме, которые на самом деле не нужно менять, слишком много работы в зависимости от того, что вам действительно нужно делать.
object.dock = Fill
Panel.Controls.Add(object)
Я знаю, что это старый пост, но я обнаружил кое-что полезное. Чтобы программно настроить родственный порядок управления для динамически создаваемых элементов управления, вы можете сделать что-то вроде:
parentForm.Controls.SetChildIndex (myPanel, 0)
В моем случае я сделал это, чтобы переместить панель Dock / Fill в качестве первого элемента управления в моей форме, чтобы она не перекрывалась с другим закрепленным элементом управления, установленным на Dock / Top (полоса меню).
Также может быть быстрым решением взять компонент «Заливка» и щелкнуть правой кнопкой мыши, вырезать и вставить в нужную область.
Просто, Боже, это меня действительно раздражало.