Panel.Dock 填充忽略其他 Panel.Dock 设置
Posted
技术标签:
【中文标题】Panel.Dock 填充忽略其他 Panel.Dock 设置【英文标题】:Panel.Dock Fill ignoring other Panel.Dock setting 【发布时间】:2010-09-14 08:22:57 【问题描述】:如果您在表单上创建一个面板并将其设置为 Dock=Top,然后放下另一个面板并设置其 Dock=Fill,它可能会填充整个表单,而忽略第一个面板。更改 Tab 键顺序没有任何作用。
【问题讨论】:
【参考方案1】:用 Dock=Fill 右键单击面板,然后单击“置于前面”。
这使得该控件最后创建,这考虑了同一容器中其他控件的 Dock 设置。
【讨论】:
简单,天哪,这真的让我很烦 想想就明白了。【参考方案2】:另一个可能更简洁的选项是使用 TableLayout 控件。为您的顶部码头设置一排所需的高度,另一排为您的底部填充 100%。将里面的两个面板都设置为 Fill,就完成了。
(不过,TableLayout 确实需要一些时间来适应。)
【讨论】:
TableLayout 在布局性能方面也比停靠控件慢,特别是如果您有使用 TableLayout 的嵌套用户控件。但是,它确实会产生一个不错的布局。 如上所述,这种性能是否达到了普通用户在两个面板的简单情况下会看到的水平?或者当你有几十个 UC 时,他们会注意到什么,都带有布局,都在一个布局中? (讽刺的是,我现在做的这个app就是这样,性能好像还可以……) TableLayout 非常轻量级。如果您只是布置一些控件,您不会看到性能问题。【参考方案3】:这是一个对我有用的技巧..
放置顶部项目并将其停靠在顶部。
放置一个拆分器,并将其停靠在顶部,然后将其设置为禁用(除非您想调整顶部的大小)。
然后放置 Fill 对象并将 Docking 设置为 Fill。该对象将停留在拆分器下方。
【讨论】:
【参考方案4】:停靠布局取决于同级控件的顺序。控件停靠在“按钮向上”,因此集合中的最后一个控件首先停靠。停靠控件仅考虑以前停靠的兄弟姐妹的布局。因此,如果您希望它考虑其他停靠控件,则 Dock=Fill 的控件应该在同级顺序中位于第一个(顶部)。如果它不是第一个控件,则之前的控件将与它重叠。
这可能会造成混淆,因为同级顺序不一定与视觉顺序相同,而且同级顺序在设计视图中并不总是显而易见的。
文档大纲窗口(视图 -> 其他窗口 -> 文档大纲)提供了一个有用的控件层次结构和顺序的树形视图,并允许您更改控件的同级顺序。
您还可以通过上下文菜单直接在设计器中更改兄弟顺序 -> 放在前面/发送到后面,这会将控件移动到兄弟的第一个或最后一个。这些菜单标签可能会有些混乱,因为实际效果取决于布局模型。
使用固定定位控件,2D 位置与兄弟顺序无关,但当控件重叠时,顺序中最早的控件将“在顶部”,隐藏顺序中较晚的部分兄弟。在这种情况下,放在前面/放在后面是有意义的。
在流程或表格布局面板中,创建顺序决定了控件的视觉顺序。没有重叠的控件。所以带到前面/发送到后面实际上意味着按照控件的顺序先制作或最后制作。
使用停靠布局,放在前面/放在后面可能会更加混乱,因为它决定了计算停靠的顺序,所以“放在前面”的填充停靠控件会将控件放在 middle 父级,考虑所有边缘停靠控件。
【讨论】:
我在表单上有一个面板、状态条和菜单条,似乎当我将菜单条停靠在顶部,状态条停靠在底部并填充面板时,面板不会填充两个条带之间的空间,除非它是第一个兄弟(位于两个条带上方的文档大纲窗口顶部)。将面板向下移动(朝向“最后一个”)覆盖条带。那么 Dock=Fill 控件实际上应该是顺序中的第一个兄弟吗?我读错了吗?我正在使用 3.5 (2008)。这有变化吗? tl;博士;右键单击带有 Dock=Fill 的面板,然后单击“置于前面”。 +1 用于文档大纲窗口。从来不知道它存在,但它非常有用。 如何以编程方式执行此操作?我的意思是,我正在动态添加控件,所以我不能使用设计器来执行此操作。 @Camilo:如果你动态添加控件,你应该按照你想要的顺序添加它们。【参考方案5】:JacquesB 有文档大纲的想法,但层次结构并没有解决我的问题。 我的控件不是分层样式,它们只是与同一个父级一起列出。
我了解到,如果您更改顺序,它将修复您想要的外观。
列表底部的控件将在“文档大纲”窗口中与列表顶部的控件重叠。在您的情况下,您将确保第一个面板位于第二个面板下方,依此类推。
【讨论】:
【参考方案6】:我遇到了同样的问题,我设法解决了。
如果您有一个带有 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.
【讨论】:
【参考方案7】:如果您不想更改代码中元素的顺序,可以使用 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;
【讨论】:
【参考方案8】:我遇到了同样的问题。我的是在运行时在菜单条下方添加新的/自定义控件。问题是停靠时的控件,决定从表单顶部停靠并完全忽略菜单条,如果你问我,这很烦人。 由于这必须通过代码动态完成,而不是在设计模式期间,这变得非常令人沮丧。我发现最简单的方法是在设计模式下创建一个面板并停靠在菜单条下方。从那里您可以将控件添加/删除到面板,您可以在运行时停靠它。无需弄乱表单上不需要更改的所有控件,过多的工作取决于您真正需要做的事情。
object.dock = Fill
Panel.Controls.Add(object)
【讨论】:
【参考方案9】:我知道这是一篇旧帖子,但我发现了一些有用的东西。要以编程方式为动态创建的控件调整同级控件顺序,您可以执行以下操作:
parentForm.Controls.SetChildIndex (myPanel, 0)
在我的例子中,我这样做是为了将 Dock/Fill 面板移动到我的表单中的第一个控件,这样它就不会与另一个设置为 Dock/Top(菜单条)的停靠控件重叠。
【讨论】:
【参考方案10】:获取“填充”组件并右键单击、剪切并粘贴到所需区域也可能是一种快速解决方案。
【讨论】:
以上是关于Panel.Dock 填充忽略其他 Panel.Dock 设置的主要内容,如果未能解决你的问题,请参考以下文章