【问题标题】:Docking multiple controls - one fills remaining space对接多个控件 - 一个填充剩余空间
【发布时间】:2011-10-13 04:17:34
【问题描述】:

我正在尝试将 N 个控件停靠在一个容器中。我希望它们都填满整个宽度,但要堆叠。我想要一个特定的控件(当前是最后一个)来填充剩余空间,而所有其他控件都有固定的大小。

这个:

Button b1 = new Button() { Text = "Button 1", Dock = DockStyle.Top };
Button b2 = new Button() { Text = "Button 2", Dock = DockStyle.Top };
Button b3 = new Button() { Text = "Button 3", Dock = DockStyle.Fill };

Controls.Add(b1);
Controls.Add(b2);
Controls.Add(b3);

产生这个:

如您所见,按钮 3 完全按照我告诉它的操作:Fill 父级。但这不是我想要它做的。除了手动放置和处理调整大小事件等之外,如何让 Button 3 填充剩余空间?

注意:我使用设计器。

【问题讨论】:

标签: c# .net winforms


【解决方案1】:

虽然添加b3.BringToFront()(在添加到Controls 之后)有效,但这里最简单的解决方案是简单地更改按钮添加到Controls 的顺序。以下代码完美运行:

Button b1 = new Button() { Text = "Button 1", Dock = DockStyle.Top };
Button b2 = new Button() { Text = "Button 2", Dock = DockStyle.Top };
Button b3 = new Button() { Text = "Button 3", Dock = DockStyle.Fill };

Controls.Add(b3);    // this guy first!
Controls.Add(b1);
Controls.Add(b2);

结果:

如果您仔细查看这个小示例中的边框,这实际上似乎比BringToFront() 更有效

【讨论】:

  • 如果您右击 button3 并单击“Brint to Front”,它会为您完成此操作。
  • 只有在你使用设计器时才有效,在这种情况下我不是。
  • 有没有办法在按钮之间放置间距?有填充/边距?
【解决方案2】:

基本上DockStyle.Fill 控件应该首先添加到Controls 集合中。

【讨论】:

    【解决方案3】:

    在设计器中的 Button 3 上使用“置于前面”,或调用以下代码:

    b3.BringToFront();
    

    【讨论】:

    • 感谢您向我指出 Z 顺序。我知道这会影响它们停靠的顺序(尤其是DockStyle.Top 的),但我没想过要移动我的DockStyle.Fill control。请参阅我的答案以获得不同的看法。
    • 是的,这是正确的答案。 Z 顺序很重要。您也可以在 IDE 中执行此操作。此外,建议使用面板进行布局。
    【解决方案4】:

    按钮 1 和 2 应该将停靠属性设置为顶部,并且要使按钮 3 占据其余空间,您可以将其停靠属性设置为底部。

    dock = fill 将使按钮填充整个空间而不仅仅是剩余空间。底部的功能与顶部一样,但将其锚定到父容器的底部。按 1、2、3 的顺序应用按钮。

    此外,您可以将停靠属性设置为所有三个的顶部,并简单地调整三个按钮的不同大小。

    【讨论】:

    • WinForms 没有堆栈面板。 Panel、FlowLayoutPanel 和 TableLayoutPanel 任你选择。
    • 抱歉,刚刚从 WPF 项目中退出,哈哈。编辑为正确。 FlowLayoutPanel 不会做同样的事情吗?它流动,但将停靠设置为顶部,子控件宽度将等于父容器宽度,因此它们正确显示流动。只是想跳出框框思考一下。
    猜你喜欢
    • 1970-01-01
    • 2017-12-18
    • 2021-10-29
    • 1970-01-01
    • 2010-09-10
    • 2010-09-10
    相关资源
    最近更新 更多