面板。船坞填充忽略其他面板。船坞设置

如果在窗体上创建一个面板,并将其设置为 Dock = Top,然后删除另一个面板,并将其设置为 Dock = Fill,那么它可能会填充整个窗体,忽略第一个面板。更改制表符顺序没有任何作用。

105514 次浏览

右键单击面板 Dock = Fill,然后单击“带到前面”。

这使得该控件成为最后创建的,这将考虑到同一容器中其他控件的 Dock 设置。

另一个可能更干净的选项是使用 TableLayout 控件。设置一行所需的高度为您的顶部码头,另一行填补100% 为您的底部。将两个面板都设置为“填充”,就可以完成了。

(不过,TableLayout 确实需要一些时间来适应。)

这是一个对我有用的技巧。

放置顶部项目,并停靠在顶部。

放置一个拆分器,也停靠在顶部,然后设置为禁用(除非你想调整顶部大小)。

然后放置“填充”对象并设置“对接”为“填充”。该对象将保持在拆分器的下方。

停靠布局取决于同级控件的 秩序。控件停靠在“按钮向上”,因此 集合中的最后一个控件首先停靠。停靠控件只考虑 前情提要停靠兄弟节点的布局。因此,如果您希望将其他停靠的控件考虑在内,那么 Dock = Fill 的控件应该是兄弟顺序中的第一个(顶部)。如果它不是第一个控件,则早期的控件将与其重叠。

这可能会造成混淆,因为兄弟顺序不一定与视觉顺序相同,而且从设计视图来看,兄弟顺序并不总是很明显。

文件大纲窗口(视图-> 其他 Windows-> 文档大纲)为控件层次结构和顺序提供了一个有用的树形视图,并允许您更改控件的兄弟顺序。

您还可以通过上下文菜单直接在设计器中更改兄弟顺序-> 带到前面/发送到后面,将控件移动到兄弟顺序的第一个或最后一个。由于实际效果取决于布局模型,因此这些菜单标签可能有些令人困惑。

对于固定位置的控件,2D 位置独立于兄弟顺序,但是当控件重叠时,最早的控件将位于“顶部”,隐藏后面的部分兄弟顺序。在这种情况下,向前/向后发送是有意义的。

在流或表布局面板中,创建顺序决定控件的可视顺序。没有重叠控制。因此,bring to front/send to back 实际上意味着按照控件的顺序创建第一个或最后一个。

对于停靠布局,带到前面/发送到后面可能会更加混乱,因为它决定了停靠计算的顺序,所以“带到前面”在一个填充停靠控件将把控件放在父控件的 中间中,考虑到所有的边缘停靠控件。

JacquesB 有关于文档大纲的想法,但层次结构并没有解决我的问题。 我的控件不是分层样式的,它们只是列出了相同的父级。

我学到了,如果你改变顺序,它会修正你想要它看起来的样子。

列表底部的控件将与“文档大纲”窗口中列表顶部的控件重叠。在您的情况下,您应该确保第一个面板位于第二个面板的下方,以此类推。

我也遇到过同样的问题,我设法解决了。
如果你有一个带有 DockStyle.Fill的容器,其他容器也应该有 DockStyle 但是 Top 或者任何你想要的。
重要的是首先在 Controls 中使用 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。控制。SetChildIndex () ,容器是例如窗体,面板等,你想要添加你的控件。

例如:

     //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;

我也遇到了同样的问题。我的方法是在运行时在菜单条下面添加新的/自定义控件。问题在于停靠时的控件,决定从表单顶部停靠,完全忽略了菜单条,如果你问我的话,我会说非常烦人。 由于这必须通过代码而不是在设计模式下动态完成,这变得非常令人沮丧。我发现的最简单的方法是在设计模式下创建一个面板,并停靠在菜单条下面。从那里您可以只添加/删除控件到面板,并且您可以在运行时停靠它。不需要改变窗体上所有不需要更改的控件,太多的工作取决于您真正需要做的事情。

object.dock = Fill
Panel.Controls.Add(object)

我知道这是一个老职位,但我发现了一些有用的东西。要为动态创建的控件以编程方式调整同级控件顺序,可以执行以下操作:

parentForm.Controls.SetChildIndex (myPanel, 0)

在我的例子中,我这样做是为了将 Dock/Fill 面板移动到窗体中的第一个控件,这样它就不会与设置为 Dock/Top (菜单条)的另一个停靠控件重叠。

也可能是一个快速的解决方案,采取“填充”组件和右键单击,剪切和粘贴在所需的区域。