如果您在表单上创建一个面板并将其设置为Dock = Top并放置另一个面板并设置其Dock = Fill,则它可能会填充整个表单,而忽略第一个面板。更改制表符顺序无济于事。
如果您在表单上创建一个面板并将其设置为Dock = Top并放置另一个面板并设置其Dock = Fill,则它可能会填充整个表单,而忽略第一个面板。更改制表符顺序无济于事。
Answers:
对接布局取决于同级控件的顺序。控件停靠在“按钮上”,因此集合中的最后一个控件首先停靠。停靠控件仅考虑了先前停靠的兄弟姐妹的布局。因此,如果您希望Dock = Fill的控件考虑到其他停靠的控件,则该控件应在同级控件中位于第一个(顶部)。如果不是第一个控件,则较早的控件将与它重叠。
这可能会造成混淆,因为同级顺序不一定与视觉顺序相同,并且同级顺序从设计视图中并不总是显而易见的。
该文档大纲窗口(视图- >其他窗口- >文件轮廓)给出了一个有用的树视图控件上的层次结构和秩序,并允许您更改控件的同级次序。
您还可以直接在设计器中通过上下文菜单-> Bring to front / Send back back来更改兄弟姐妹的顺序,这会将控件移动到兄弟姐妹中的第一个或最后一个。这些菜单标签可能会有些混乱,因为实际效果取决于布局模型。
对于固定位置的控件,2D位置与兄弟姐妹顺序无关,但是当控件重叠时,最早的控件将在“顶部”,从而在该顺序的后面隐藏部分兄弟姐妹。在这种情况下,向前/向后发送是有意义的。
在流或表布局面板内部,创建顺序确定控件的视觉顺序。没有重叠的控件。因此,向前/向后发送实际上意味着按照控件的顺序进行操作。
使用停靠的布局时,“前移/后退”可能会更加令人困惑,因为它确定了对接的计算顺序,因此,在对接控件上“前移”会将控件放置在父级的中间,并考虑所有边缘对接控件。
另一个可能更清洁的选项是使用TableLayout控件。为您的顶部坞站设置一行所需高度,并为您的底部设置另一行以填充100%的高度。将两个面板都设置为Fill,即可完成。
(不过,TableLayout确实需要一些习惯。)
我遇到了同样的问题,并且设法解决了。
如果您与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.
如果您不想更改代码中元素的顺序,则可以使用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;