Если вы создаете панель в форме и устанавливаете для нее значение Dock=Top, а затем отбрасываете другую панель и устанавливаете для нее Dock=Fill, она может заполнить всю форму, игнорируя первую панель. Изменение порядка табуляции ничего не дает.
Заливка Panel.Dock с игнорированием других настроек Panel.Dock
Ответы:
Макет стыковки зависит от порядка родственных элементов управления. Элементы управления закрепляются "кнопкой вверх", поэтому последний элемент управления в коллекции закрепляется первым. Закрепленный элемент управления принимает во внимание только расположение ранее закрепленных элементов того же уровня. Следовательно, элемент управления с Dock=Fill должен быть первым (сверху) в порядке братьев и сестер, если вы хотите, чтобы он учитывал другие закрепленные элементы управления. Если это не первый элемент управления, более ранние элементы управления будут перекрывать его.
Это может сбивать с толку, потому что порядок братьев и сестер не обязательно совпадает с визуальным порядком, а порядок братьев и сестер не всегда очевиден в представлении дизайна.
Окно Структура документа (Просмотр -> Другие окна -> Структура документа) дает полезное древовидное представление иерархии и порядка элементов управления, а также позволяет изменить порядок элементов управления.
Вы также можете изменить порядок братьев и сестер непосредственно в дизайнере с помощью контекстного меню -> На передний план / Отправить на задний план, что перемещает элемент управления на первый или последний из братьев и сестер. Эти метки меню могут несколько сбивать с толку, поскольку фактический эффект зависит от модели макета.
При фиксированном расположении элементов управления 2D-позиция не зависит от порядка элементов одного уровня, но когда элементы управления перекрываются, элемент управления, самый ранний в порядке, будет «сверху», скрывая часть элементов одного уровня, расположенных позже в порядке. В этом контексте «Перенести на передний план/Отправить на задний план» имеет смысл.
Внутри панелей потоковой или табличной компоновки порядок создания определяет визуальный порядок элементов управления. Нет перекрывающихся элементов управления. Таким образом, вывести на передний план/отправить на задний план на самом деле означает сделать первым или последним в порядке элементов управления.
При закрепленном макете перемещение на передний план / отправка на задний план может быть еще более запутанным, поскольку оно определяет, в каком порядке вычисляется стыковка, поэтому "переместить на передний план" элемента управления с заливкой поместит элемент управления в середину. родителя, принимая во внимание все пристыкованные элементы управления.
Щелкните правой кнопкой мыши панель с Dock=Fill и выберите «На передний план».
Это заставляет этот элемент управления создаваться последним, что учитывает параметры Dock для других элементов управления в том же контейнере.
У меня была та же проблема, и мне удалось ее решить.
Если у вас есть контейнер с 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.
Другой, потенциально более чистый вариант — использовать элемент управления TableLayout. Настройте одну строку желаемой высоты для верхней док-станции и другую строку, чтобы заполнить 100% для нижней. Установите обе панели внутри на Fill, и все готово.
(Однако к TableLayout нужно привыкнуть.)
Если вы не хотите менять порядок элементов внутри кода, вы можете использовать метод 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;
У JacquesB была идея со структурой документа, но иерархия не решила мою проблему. Мои элементы управления не были в иерархическом стиле, они просто были перечислены с одним и тем же родителем.
Я узнал, что если вы измените порядок, он исправит то, как вы хотите.
Элементы управления в нижней части списка будут перекрывать элементы управления в верхней части списка в окне «Структура документа». В вашем случае вы должны убедиться, что первая панель находится ниже второй панели и так далее.
Вот трюк, который сработал для меня ..
Поместите верхний элемент и закрепите его сверху.
Поместите разделитель, а также закрепите его сверху, затем отключите его (если только вы не хотите изменить размер верхней части).
Затем поместите объект «Заливка» и установите для параметра «Стыковка» значение «Заливка». Объект останется ниже разделителя.
Я столкнулся с той же проблемой. Мой был с добавлением новых/настраиваемых элементов управления под полосой меню во время выполнения. Проблема заключалась в том, что элементы управления при стыковке решили стыковать с верхней части формы и полностью игнорировать полосу меню, что очень раздражает, если вы спросите меня. Поскольку это нужно было делать динамически с кодом, а не в режиме разработки, это стало крайне неприятно. Самый простой способ, который я нашел, — это создать панель в режиме дизайна и закрепить ее под полосой меню. Оттуда вы можете просто добавлять/удалять элементы управления на панель, и вы можете закрепить ее во время выполнения. Не нужно возиться со всеми вашими элементами управления в форме, которые на самом деле не нужно менять, слишком много работы в зависимости от того, что вам действительно нужно сделать.
object.dock = Fill
Panel.Controls.Add(object)
Я знаю, что это старый пост, но я обнаружил кое-что полезное. Чтобы программно настроить порядок элементов управления для динамически создаваемых элементов управления, вы можете сделать что-то вроде:
parentForm.Controls.SetChildIndex (myPanel, 0)
В моем случае я сделал это, чтобы переместить панель Dock/Fill в качестве первого элемента управления в моей форме, чтобы он не перекрывался с другим закрепленным элементом управления, для которого установлено значение Dock/Top (полоса меню).
Также может быть быстрым решением взять заполненный компонент и щелкнуть правой кнопкой мыши, вырезать и вставить в нужную область.