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

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

当windowstate正常并且最大化时,如何确保所有文本框都位于相同位置且大小相同?

编辑:

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

编辑:

flowlayoutpanel会在这里有用吗?

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

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

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

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

  1. 使用FlowLayoutPanel ,注意FlowDirection ,可能只是事先创建所有需要的控件,只需切换可见状态即可。
  2. 对新创建的控件的位置使用正确的值。

第二点是你所犯的错误(我认为)。 如果您的表单具有原始大小,您会发现计算控件的位置。 要在表单大小发生变化(例如最大化)时获得正确的位置,您必须考虑几个因素。

  • 增量值从默认大小到当前大小。
  • 您希望在控件上设置的锚点。

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

如果没有锚的行为和计算,对于Top | Bottom Top | BottomLeft | Right 设置的Left | Right留给读者作为练习。 😉

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

  • 如果您想在某处放置一个新控件, Form.Visible更改为false
  • 保存表单状态,大小和位置
  • 将它们更改为默认值
  • 添加所需的控件
  • 恢复以前保存的值
  • 使表单再次可见。

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

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