Если вы создаете панель в форме и устанавливаете ее в Dock = Top, а затем отбрасываете другую панель и устанавливаете ее Dock = Fill, она может заполнять всю форму, игнорируя первую панель. Изменение порядка вкладок ничего не делает.
Panel.Dock Fill игнорирует другие настройки Panel.Dock
Ответ 1
Расположение док-станции зависит от порядка элементов управления сайтом. Элементы управления состыкованы "кнопка вверх", поэтому последний элемент управления в сборке сначала состыкован. Пристыкованный контроль учитывает только расположение ранее пристыкованных братьев и сестер. Следовательно, контроль с Dock = Fill должен быть первым (сверху) в порядке брака, если вы хотите, чтобы он учитывал другие пристыкованные элементы управления. Если это не первый элемент управления, более ранние элементы управления будут перекрывать его.
Это может сбивать с толку, потому что порядок братьев и сестер не обязательно совпадает с визуальным порядком, и порядок брака не всегда проявляется в дизайне.
Окно Очертания документа (Вид → Другие окна Windows → Структура документа) дает полезное древовидное представление по иерархии и порядку управления и позволяет вам изменять порядок элементов управления для сестер.
Вы также можете изменить порядок брака непосредственно в дизайнере по контекстному меню → Привести на передний план/Отправлять обратно, который перемещает элемент управления, чтобы быть первым или последним из братьев и сестер. Эти ярлыки меню могут быть несколько запутанными, поскольку фактический эффект зависит от модели макета.
С фиксированными позиционируемыми позициями двумерное положение не зависит от порядка брака, но когда элементы управления перекрываются, элемент управления, в начале которого находится в порядке, будет "сверху", спрятав часть братьев и сестер позже в порядке. В этом контексте Приведение к фронту/Отправка назад имеет смысл.
Внутри панели управления потоком или таблицей порядок создания определяет визуальный порядок элементов управления. Нет перекрывающихся элементов управления. Таким образом, вывести на передний план/отправить назад действительно означает сделать первый или последний в порядке элементов управления.
С пристыкованной компоновкой приведение на передний план/отправка назад может быть еще более запутанным, так как он определяет, в каком порядке рассчитывается стыковка, поэтому "довести до фронта" на залитом док-станцией элемент управления будет располагаться в середине родительского элемента, принимая во внимание все элементы управления, закрепленные за фронтом.
Ответ 2
Щелкните правой кнопкой мыши на панели с помощью Dock = Fill и нажмите "Bring to Front".
Этот элемент управления создается последним, что учитывает настройки Dock для других элементов управления в одном контейнере.
Ответ 3
Другим, потенциально более чистым вариантом является использование элемента управления TableLayout. Настройте один ряд желаемой высоты для верхней док-станции и еще одну строку, чтобы заполнить 100% для вашего дна. Установите обе панели внутри Fill, и все готово.
(TableLayout делает некоторые привыкания, хотя.)
Ответ 4
У меня была такая же проблема, и мне удалось ее решить.
Если у вас есть контейнер с DockStyle.Fill
, другие должны также иметь DockStyle, но Top или все, что вы хотите.
Важно добавить элемент управления DockStyle.Fill
сначала в элементы управления, а затем остальные.
Пример:
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 first
Controls.Add(cb);
Controls.Add(gv); // gv will overlap the combo box.
Ответ 5
У JacquesB была идея с контуром документа, но иерархия не решила мою проблему. Мои элементы управления не были в иерархическом стиле, они просто были перечислены с одним и тем же родителем.
Я узнал, что если вы изменили порядок, он будет исправлять то, как вы хотите, чтобы он выглядел.
Элементы управления в нижней части списка перекрывают элементы управления над ним в окне "Структура документа". В вашем случае вы убедитесь, что первая панель находится ниже второй панели и т.д.
Ответ 6
Если вы не хотите изменять порядок элементов внутри кода, вы можете использовать метод Container.Controls.SetChildIndex() с контейнером, являющимся, например, Form, Panel и т.д., Вы хотите добавить свои элементы управления.
Пример:
//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;
Ответ 7
Вот трюк, который сработал у меня..
Поместите верхний элемент и прикрепите его вверх.
Поместите Splitter, а также соедините его сверху, а затем установите его отключенным (если вы не хотите изменять размер верхней части).
Затем поместите объект Fill и установите Docking to Fill. Объект будет находиться ниже разделителя.
Ответ 8
Я столкнулся с той же проблемой. Мой был с добавлением новых/пользовательских элементов управления под полосой меню во время выполнения. Проблема была в элементах управления, когда они были состыкованы, решили состыковаться с верхней части формы и полностью игнорировать полосу меню, что очень раздражает, если вы спросите меня. Поскольку это должно было быть сделано динамически с кодом, а не в режиме разработки, это стало чрезвычайно неприятным. Самый простой способ, который я нашел, - это создать панель в режиме дизайна и закрепить ее под полосой меню. Оттуда вы можете просто добавить/удалить элементы управления на панель и закрепить их во время выполнения. Нет необходимости связываться со всеми вашими элементами управления в форме, которые на самом деле не нужно менять, слишком много работы в зависимости от того, что вам действительно нужно сделать.
object.dock = Fill
Panel.Controls.Add(object)
Ответ 9
Я знаю, что это старый пост, но я обнаружил что-то полезное. Чтобы программно настроить порядок элементов управления для динамически создаваемых элементов управления, вы можете сделать что-то вроде:
parentForm.Controls.SetChildIndex (myPanel, 0)
В моем случае я сделал это, чтобы панель Dock/Fill стала первым элементом управления в моей форме, чтобы она не перекрывалась с другим закрепленным элементом управления, установленным в Dock/Top (полоса меню).