Panel.Dock Fill игнорируя другие настройки Panel.Dock - PullRequest
140 голосов
/ 30 сентября 2008

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

Ответы [ 9 ]

305 голосов
/ 01 марта 2010

Расположение стыковки зависит от порядка элементов управления родного брата. Элементы управления закрепляются «кнопкой вверх», поэтому последний элемент управления в коллекции закрепляется первым. Пристыкованный элемент управления учитывает только расположение ранее пристыкованных братьев и сестер. Следовательно, элемент управления с Dock = Fill должен быть первым (верхним) в том же порядке, если вы хотите, чтобы он учитывал другие закрепленные элементы управления. Если это не первый элемент управления, более ранние элементы управления будут перекрывать его.

Это может сбивать с толку, потому что порядок родного брата не обязательно совпадает с визуальным порядком, а порядок родного брата не всегда очевиден с точки зрения дизайна.

Окно Структура документа («Просмотр» -> «Другие окна» -> «Структура документа») предоставляет полезное древовидное представление иерархии и порядка элементов управления и позволяет изменить порядок элементов управления в одном элементе.

Вы также можете изменить порядок родного брата непосредственно в конструкторе с помощью контекстного меню -> Перевести на передний план / Отправить на задний план, в результате чего элемент управления будет первым или последним из братьев и сестер. Эти метки меню могут несколько запутать, поскольку фактический эффект зависит от модели макета.

При фиксированных позиционных элементах управления 2D-позиция не зависит от порядка одного и того же брата, но когда элементы управления перекрываются, самый ранний элемент в этом порядке будет «сверху», а часть последующих элементов в нем будет скрыта. В этом контексте имеет смысл выводить на передний план / отправлять на задний план.

На панелях макета потока или таблицы порядок создания определяет визуальный порядок элементов управления. Там нет перекрывающихся элементов управления. Так что переводить вперед / отправлять назад действительно означает сделать первым или последним в порядке элементов управления.

При расположении в док-станции перенос на передний план / отправка на задний план может быть еще более запутанным, поскольку он определяет, в каком порядке рассчитывается стыковка, поэтому «перенести на передний план» на элементе управления с заполненным док-станцией поместит элемент управления в середина родителя, принимая во внимание все закрепленные за кромкой элементы управления.

100 голосов
/ 30 сентября 2008

Щелкните правой кнопкой мыши на панели с помощью Dock = Fill и выберите «Переместить на передний план».

Это делает этот элемент управления последним, который учитывает настройки Dock для других элементов управления в том же контейнере.

7 голосов
/ 30 сентября 2008

Другим, потенциально более чистым вариантом является использование элемента управления TableLayout. Установите один ряд желаемой высоты для вашего верхнего дока, а другой ряд, чтобы заполнить 100% для вашего нижнего. Установите обе панели внутри Fill, и все готово.

(TableLayout требует некоторого привыкания.)

6 голосов
/ 11 февраля 2015

У меня была такая же проблема, и мне удалось ее решить.
Если у вас есть контейнер с 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 первым

Controls.Add(cb);
Controls.Add(gv); // gv will overlap the combo box.
1 голос
/ 10 июля 2017

Если вы не хотите изменять порядок элементов внутри кода, вы можете использовать метод 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;
1 голос
/ 08 августа 2013

У JacquesB была идея с контуром документа, но иерархия не решила мою проблему. Мои элементы управления не были в иерархическом стиле, они были просто перечислены с тем же родителем.

Я узнал, что если вы изменили порядок, он исправит то, как вы хотите.

Элементы управления в нижней части списка будут перекрывать элементы управления в верхней части окна Document Outline. В вашем случае вы должны убедиться, что первая панель находится ниже второй панели и т. Д.

0 голосов
/ 01 мая 2019

Я знаю, что это старый пост, но я обнаружил кое-что полезное. Чтобы программно настроить порядок элементов управления для динамически создаваемых элементов управления, вы можете сделать что-то вроде:

parentForm.Controls.SetChildIndex (myPanel, 0) 

В моем случае я сделал это, чтобы панель Dock / Fill стала первым элементом управления в моей форме, чтобы он не перекрывался с другим закрепленным элементом управления, установленным в Dock / Top (полоса меню).

0 голосов
/ 08 мая 2018

Я столкнулся с той же проблемой. Мой был с добавлением новых / пользовательских элементов управления под полосой меню во время выполнения. Проблема была в элементах управления, когда они были состыкованы, решили состыковаться с верхней части формы и полностью игнорировать полосу меню, что очень раздражает, если вы спросите меня. Поскольку это должно было быть сделано динамически с кодом, а не в режиме разработки, это стало чрезвычайно неприятным. Самый простой способ, который я нашел, - это создать панель в режиме дизайна и закрепить ее под полосой меню. Оттуда вы можете просто добавить / удалить элементы управления на панель и закрепить их во время выполнения. Нет необходимости связываться со всеми вашими элементами управления в форме, которые на самом деле не нужно менять, слишком много работы в зависимости от того, что вам действительно нужно сделать.

object.dock = Fill
Panel.Controls.Add(object)
0 голосов
/ 02 сентября 2009

Вот трюк, который работал для меня ..

Поместите элемент Top и закрепите его сверху.

Поместите Splitter, а также закрепите его сверху, затем отключите (если вы не хотите изменить размер верхней части).

Затем поместите объект Fill и установите Docking на Fill. Объект останется ниже сплиттера.

...