使用锚属性和动态添加的控件

时间:2009-05-03 18:07:39

标签: c# winforms

我在运行时动态地向表单添加一些文本框。一切正常,即文本框对齐,锚定并自动调整的大小,直到表单最大化。在最大化表单时,文本框被添加到同一位置,而表单最大化。这会导致文本框不对齐。

如果窗口状态正常且最大化,我如何确保所有文本框位于相同位置且大小相同?

编辑:

顺便说一下,我正在使用C#

编辑:

flowlayoutpanel会在这里有用吗?

2 个答案:

答案 0 :(得分:2)

这是一个很老的问题,但也许我能够回答它。

阅读完所有评论后,我想我可以总结一下你的问题:

  • 您有一个特定大小的表单,并在运行时在锚点设置为Top | Right的特定位置添加一些控件。
  • 如果您只是显示表单并让控件显示一切正常
  • 如果您最大化您的表单(或更改其大小),您的控件将不再出现在您想要的正确位置。

要摆脱这个问题,你可以尝试一些不同的方法:

  1. 使用FlowLayoutPanel,注意FlowDirection,也许只需事先创建所需的所有控件,然后切换可见状态。
  2. 为新创建的控件的位置使用正确的值。
  3. 第二点是你所犯的错误(我认为)。如果您的表单具有原始大小,您会发现计算控件的位置。要在表单大小发生变化(例如最大化)时获得正确的位置,您必须考虑几个因素。

    • delta值从默认大小到当前大小。
    • 您希望在控件上设置的主持人。

    在您的情况下,您希望放置一个锚定Top | Right的控件,但该位置由Top | Left设置。在这种情况下,您必须计算control.location.x和form.width之间的差异,它的默认大小。然后你取这个差异并从表格当前宽度中减去它。现在你可以把你的控件放在这个位置(因为Top永远不会通过调整大小来改变)。如果你有一个Bottom | Right的锚,你必须用control.location.y和form.height来计算它。

    如果设置了Top | BottomLeft | Right,则没有锚点的行为和计算留给读者练习。 ; - )

    最后但并非最不重要的是,还有另一种将你的控制权控制在正确位置的黑客方法:

    • 如果您想在某处放置新控件,请将Form.Visible更改为false
    • 保存表单状态,大小和位置
    • 将其更改为默认值
    • 添加您想要的控件
    • 恢复以前保存的值
    • 再次显示表单。

答案 1 :(得分:0)

Anchor属性指定控件应该确保它们始终保持相同距离的边界。它可能会变得非常混乱,这就是为什么当看到东西锚定到右边界时会发生变化的原因。

如果您只是想确保文本框显示相对于自身保持一致,我建议放下一个Panel,在Panel上锚定,然后向Panel添加文本框。文本框上的X和Y坐标相对于Panel,因此布局更容易,特别是当Panel的位置突然改变时。