C# StartPosition中心屏幕不显示';在Form.Load中调整窗体大小后无法工作

C# StartPosition中心屏幕不显示';在Form.Load中调整窗体大小后无法工作,c#,winforms,C#,Winforms,在表单加载事件中,我将向表单动态添加一些控件。 我使用以下代码调整表单大小,以使其大小适应新内容: this.MaximumSize = new Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); this.AutoSize = true; this.AutoSizeMode = AutoSizeMode.GrowAndShrink; 它工作正常,但StartPosition=FormStar

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

this.MaximumSize = new Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
this.AutoSize = true;
this.AutoSizeMode = AutoSizeMode.GrowAndShrink;
它工作正常,但
StartPosition=FormStartPosition.CenterScreen
无法按预期工作:

根据原始尺寸计算形状中心位置

我的建议是使用表单的属性调整表单大小。当您向表单添加了新控件,但这些控件不适合客户端区域时,
PreferredSize
将更新以反映包含所有控件所需的新大小,但仅限于您设置的表单的
MaximumSize

然后使用该方法将窗体居中到当前屏幕

Hans Passant在评论中建议,如果表单不是任何其他表单的父级,则具有相同的效果:即,如果未使用
.Show(this)
方法重载显示该表单;否则,它将以所有者窗体为中心

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

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

也可能有用:


因此,将控件添加到表单中(可能在
Load
处理程序中),然后:


当然,居中需要处理屏幕大小和窗口大小之间的差异。您更改了窗口大小,不再居中。添加
this.CenterToParent()再次执行此操作。
var screen = Screen.FromHandle(this.Handle);
this.MaximumSize = new Size(screen.WorkingArea.Width, screen.WorkingArea.Height);
this.ClientSize = this.PreferredSize;
this.CenterToScreen();