使用锚属性和动态添加的控件
我在运行时动态地向表单添加一些文本框。 一切正常,即文本框对齐,锚定并自动resize, 直到表单最大化。 在最大化表单时,文本框将添加到同一位置,而表单未最大化。 这会导致文本框的错位。
当windowstate正常并且最大化时,如何确保所有文本框都位于相同位置且大小相同?
编辑:
顺便说一下,我正在使用C#
编辑:
flowlayoutpanel会在这里有用吗?
这是一个相当古老的问题,但也许我能够回答它。
阅读完所有评论后,我想我可以总结一下你的问题:
- 您有一个特定大小的表单,并在运行时在特定位置添加一些控件,其中锚点设置为
Top | Right
Top | Right
。 - 如果您只是显示表单并让控件出现一切正常
- 如果您最大化您的表单(或更改其大小),您的控件将不再出现在您想要的正确位置。
要摆脱这个问题,您可以尝试一些不同的方法:
- 使用FlowLayoutPanel ,注意FlowDirection ,可能只是事先创建所有需要的控件,只需切换可见状态即可。
- 对新创建的控件的位置使用正确的值。
第二点是你所犯的错误(我认为)。 如果您的表单具有原始大小,您会发现计算控件的位置。 要在表单大小发生变化(例如最大化)时获得正确的位置,您必须考虑几个因素。
- 增量值从默认大小到当前大小。
- 您希望在控件上设置的锚点。
在你的情况下,你想要一个锚定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 | Bottom
或Left | Right
设置的Left | Right
留给读者作为练习。 😉
最后但并非最不重要的是,还有另一种将你的控制权控制在正确位置的hacky方式:
- 如果您想在某处放置一个新控件,
Form.Visible
更改为false
- 保存表单状态,大小和位置
- 将它们更改为默认值
- 添加所需的控件
- 恢复以前保存的值
- 使表单再次可见。
Anchor属性指定控件应该确保它们始终保持相同距离的边界。 它可能会变得非常混乱,这就是为什么你看到东西在锚定到右边界时转移的原因。
如果您只是想确保文本框显示相对于自身保持一致,我建议放下一个Panel,锚定在Panel上,然后向Panel添加文本框。 文本框上的X和Y坐标相对于Panel,因此布局更容易,特别是当Panel的位置突然改变时。