关于 c#:StartPosition CenterScreen 在 Form.Load 中调整窗体大小后不起作用

StartPosition CenterScreen doesn't work after resizing the Form in Form.Load

在表单加载事件中,我动态地向表单添加了一些控件。
我使用此代码调整表单的大小以使其大小适应其新内容:

1
2
3
this.MaximumSize = new Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
this.AutoSize = true;
this.AutoSizeMode = AutoSizeMode.GrowAndShrink;

它工作正常,但 StartPosition = FormStartPosition.CenterScreen 没有按预期工作:
表格中心位置是根据原始尺寸计算的。


我的建议是使用它的 PreferredSize 属性来调整表单的大小。当您将新控件添加到表单并且这些控件不适合客户区域时,将更新 PreferredSize 以反映包含所有控件所需的新大小,但仅限于表单的 MaximumSize 您已设置。
然后使用 CenterToScreen() 方法将窗体居中到当前屏幕。

Hans Passant 在评论中建议的

CenterToParent() 如果表单不是任何其他表单的父级,则具有相同的效果:即,如果它没有使用 .Show(this) 方法重载显示;否则,它以所有者表格为中心。

设置 AutoSizeMode = AutoSizeMode.GrowAndShrink(或调用 SetAutoSizeMode() 方法)然后设置 AutoSize = true 可能会产生不需要的结果。更明显的是,您无法再用正常方式调整表单的大小。 StatusStrip 占用的区域可能不被考虑等等。

请注意,如果您的应用程序不是 DpiAware,则屏幕尺寸和您的表单大小可能与预期不同。如果不是,请在此处阅读:

Windows 窗体中的高 DPI 支持

这些关于屏幕和虚拟屏幕的注释也可能有用:

所以,将您的控件添加到表单(可能在 Load 处理程序中)然后:

1
2
3
4
var screen = Screen.FromHandle(this.Handle);
this.MaximumSize = new Size(screen.WorkingArea.Width, screen.WorkingArea.Height);
this.ClientSize = this.PreferredSize;
this.CenterToScreen();