Panel.Dock填充忽略其他Panel.Dock设置

如果您在表单上创build面板并将其设置为Dock = Top并放置另一个面板并将其设置为Dock = Fill,则可能会填充整个表单,而忽略第一个面板。 更改选项卡顺序什么都不做。

停靠布局取决于兄弟控制的顺序 。 控件停靠在“button”上,因此集合中的最后一个控件首先停靠。 停靠的控件只考虑以前停靠的兄弟姐妹的布局。 因此,Dock = Fill的控件应该是兄弟顺序中的第一个(顶部),如果你想要考虑其他的停靠控件。 如果它不是第一个控件,以前的控件将会重叠。

这可能是令人困惑的,因为兄弟顺序不一定与视觉顺序相同,并且兄弟顺序在devise视图中并不总是显而易见的。

文档大纲窗口(查看 – >其他窗口 – >文档大纲)为控制层次和顺序提供了有用的树视图,并允许您更改控件的同级顺序。

您也可以通过上下文菜单直接在devise器中更改兄弟顺序 – >带到前面/发回,这将控件移动到兄弟姐妹的第一个或最后一个。 这些菜单标签可能有点混淆,因为实际效果取决于布局模型。

使用固定位置的控件时,2D位置与兄弟顺序无关,但是当控件重叠时,控件中最早的控件将位于“顶部”,隐藏部分兄弟姐妹。 在这种情况下,带到前面/发送回来是有道理的。

在stream程或表格布局面板中,创build顺序决定了控件的可视顺序。 没有重叠的控制。 所以实际上就是把前端/后端按照控制顺序先做或后做。

使用对接布局时,由于确定了对接的计算顺序,所以前置/后送可能会更令人困惑,所以在填充停靠的控件上的“前置”会将控件置于父对象的中间 ,考虑所有边缘停靠的控制。

用Dock = Fill在面板上单击鼠标右键,然后单击“置于前面”。

这使得这个控件最后被创build,考虑了同一个容器中的其他控件的Dock设置。

另一个更清晰的select是使用TableLayout控件。 为您的顶部docker设置一行所需的高度,另一行为您的底部填充100%。 将两个面板都设置为Fill,就完成了。

(TableLayout确实需要一些习惯,但是。)

我有同样的问题,我设法解决它。
如果你有一个容器DockStyle.Fill其他人也应该有DockStyle但顶部或任何你想要的。
重要的是在DockStyle.Fill控件中添加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. 

JacquesB对文档大纲有了想法,但层次结构并没有解决我的问题。 我的控件不是以同样的父项目列出的分层样式。

我了解到,如果你改变了顺序,它会修复你想要的样子。

列表底部的控件将与“文档大纲”窗口中的控件重叠。 在你的情况下,你会确保第一个面板低于第二个面板等等。

这是一个为我工作的技巧..

放置顶部项目并将其放置在顶部。

放置一个分配器,也停靠它顶部,然后将其设置为禁用(除非你想调整顶部)。

然后放置填充对象并将对接设置为填充。 对象将保持在分离器下面。

如果你不想改变代码中元素的顺序,你可以使用方法Container.Controls.SetChildIndex(),Container是例如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;