如果在窗体上创建面板并将其设置为Dock = Top并放下另一个面板并设置其Dock = Fill,则可能会填充整个窗体,而忽略第一个面板.更改Tab键顺序不起作用.
停靠布局取决于兄弟控件的顺序.控件停靠在"按钮向上",因此集合中的最后一个控件首先停靠.停靠控件仅考虑先前停靠的兄弟姐妹的布局.因此,如果您希望将其他停靠控件考虑在内,那么使用Dock = Fill的控件应该是兄弟顺序中的第一个(顶部).如果它不是第一个控件,则早期控件将重叠它.
这可能令人困惑,因为兄弟顺序不一定与视觉顺序相同,并且兄弟顺序在设计视图中并不总是显而易见的.
" 文档大纲"窗口("视图" - >"其他Windows" - >"文档大纲")为控件层次结构和顺序提供了有用的树视图,并允许您更改控件的同级顺序.
您还可以通过上下文菜单直接在设计器中更改兄弟顺序 - > Bring to front/Send to back,这会将控件移动到兄弟姐妹的第一个或最后一个.这些菜单标签可能有些混乱,因为实际效果取决于布局模型.
对于固定定位控件,2D位置与兄弟顺序无关,但是当控件重叠时,顺序中最早的控件将"在顶部",稍后将按顺序隐藏兄弟姐妹的一部分.在这种情况下,带到前面/发送到后面是有道理的.
在内部流程或表格布局面板中,创建顺序决定了控件的可视顺序.没有重叠的控件.所以带到前面/后面发送真的意味着按照控件的顺序制作第一个或最后一个.
使用停靠布局时,前置/后置发送可能会更加混乱,因为它确定了对接的计算顺序,因此填充对接控件上的"前置"会将控件置于父对象的中间,考虑所有边缘停靠控件.
用Dock = Fill右键单击面板,然后单击"Bring to Front".
这使得此控件最后创建,它考虑了同一容器中其他控件的Dock设置.
另一个可能更清晰的选择是使用TableLayout控件.为顶部底座设置所需高度的一行,为底部填充另一行100%.将两个面板都设置为Fill,然后就完成了.
(TableLayout确实需要一些时间来习惯.)
我遇到了同样的问题,我设法解决了这个问题.
如果你有一个容器与 DockStyle.Fill
其他人也应该有DockStyle但顶部或任何你想要的.
重要的是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.