Panel.Dock Fill игнорирует другие настройки Panel.Dock

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

Ответ 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 (полоса меню).