【发布时间】:2010-09-14 08:22:57
【问题描述】:
如果您在表单上创建一个面板并将其设置为 Dock=Top,然后放下另一个面板并设置其 Dock=Fill,它可能会填充整个表单,而忽略第一个面板。更改 Tab 键顺序没有任何作用。
【问题讨论】:
标签: c# .net winforms visual-studio-2005
如果您在表单上创建一个面板并将其设置为 Dock=Top,然后放下另一个面板并设置其 Dock=Fill,它可能会填充整个表单,而忽略第一个面板。更改 Tab 键顺序没有任何作用。
【问题讨论】:
标签: c# .net winforms visual-studio-2005
用 Dock=Fill 右键单击面板,然后单击“置于前面”。
这使得该控件最后创建,这考虑了同一容器中其他控件的 Dock 设置。
【讨论】:
另一个可能更简洁的选项是使用 TableLayout 控件。为您的顶部码头设置一排所需的高度,另一排为您的底部填充 100%。将里面的两个面板都设置为 Fill,就完成了。
(不过,TableLayout 确实需要一些时间来适应。)
【讨论】:
这是一个对我有用的技巧..
放置顶部项目并将其停靠在顶部。
放置一个拆分器,并将其停靠在顶部,然后将其设置为禁用(除非您想调整顶部的大小)。
然后放置 Fill 对象并将 Docking 设置为 Fill。该对象将停留在拆分器下方。
【讨论】:
停靠布局取决于同级控件的顺序。控件停靠在“按钮向上”,因此集合中的最后一个控件首先停靠。停靠控件仅考虑以前停靠的兄弟姐妹的布局。因此,如果您希望它考虑其他停靠控件,则 Dock=Fill 的控件应该在同级顺序中位于第一个(顶部)。如果它不是第一个控件,则之前的控件将与它重叠。
这可能会造成混淆,因为同级顺序不一定与视觉顺序相同,而且同级顺序在设计视图中并不总是显而易见的。
文档大纲窗口(视图 -> 其他窗口 -> 文档大纲)提供了一个有用的控件层次结构和顺序的树形视图,并允许您更改控件的同级顺序。
您还可以通过上下文菜单直接在设计器中更改兄弟顺序 -> 放在前面/发送到后面,这会将控件移动到兄弟的第一个或最后一个。这些菜单标签可能会有些混乱,因为实际效果取决于布局模型。
使用固定定位控件,2D 位置与兄弟顺序无关,但当控件重叠时,顺序中最早的控件将“在顶部”,隐藏顺序中较晚的部分兄弟。在这种情况下,放在前面/放在后面是有意义的。
在流程或表格布局面板中,创建顺序决定了控件的视觉顺序。没有重叠的控件。所以带到前面/发送到后面实际上意味着按照控件的顺序先制作或最后制作。
使用停靠布局,放在前面/放在后面可能会更加混乱,因为它决定了计算停靠的顺序,所以“放在前面”的填充停靠控件会将控件放在 middle 父级,考虑所有边缘停靠控件。
【讨论】:
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.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;
【讨论】:
我遇到了同样的问题。我的是在运行时在菜单条下方添加新的/自定义控件。问题是停靠时的控件,决定从表单顶部停靠并完全忽略菜单条,如果你问我,这很烦人。 由于这必须通过代码动态完成,而不是在设计模式期间,这变得非常令人沮丧。我发现最简单的方法是在设计模式下创建一个面板并停靠在菜单条下方。从那里您可以将控件添加/删除到面板,您可以在运行时停靠它。无需弄乱表单上不需要更改的所有控件,过多的工作取决于您真正需要做的事情。
object.dock = Fill
Panel.Controls.Add(object)
【讨论】:
我知道这是一篇旧帖子,但我发现了一些有用的东西。要以编程方式为动态创建的控件调整同级控件顺序,您可以执行以下操作:
parentForm.Controls.SetChildIndex (myPanel, 0)
在我的例子中,我这样做是为了将 Dock/Fill 面板移动到我的表单中的第一个控件,这样它就不会与另一个设置为 Dock/Top(菜单条)的停靠控件重叠。
【讨论】:
获取“填充”组件并右键单击、剪切并粘贴到所需区域也可能是一种快速解决方案。
【讨论】: