为什么不直接从代码中使用Form.CenterToScreen?

cto*_*mek 2 c# winforms

来自msdn:

不要直接从您的代码中调用它.而是将StartPosition属性设置为CenterScreen.

谁知道为什么?

Han*_*ant 9

因为当你看到这个注释的MSDN Library中的通常的原因,也有办法,你会使用这个毛病太多胜算.代码中只有一个地方可以调用此方法并获得预期结果.

这是由表单的Size属性引起的问题.当然需要知道如何集中它.太多的程序员将他们在"属性"窗口中看到的值视为福音,他们会假设窗口也会在用户的计算机上具有该大小.这种情况很少发生.

第一个问题是用户首选项,他们可以更改标题文本和控制按钮的大小.或者他们将启用Aero(或不启用),这会使窗口变胖.这可能会导致大小关闭一定量,实际窗口的大小在运行时将与您在"属性"窗口中看到的大小不同.Winforms已经适应的东西,它实际上并不存储您的设计的Size属性,它存储ClientSize属性.在创建窗口时,CreateHandle()方法运行时,实际大小是未知的.所以你不能在窗体的构造函数中调用CenterToScreen(),也不能在Show()调用之前调用它,这太早了.

第二个问题是表单的AutoScaleMode属性.最近特别重要的是,许多用户不再以96 DPI的默认设置运行他们的机器.自Vista以来特别容易改变.这将导致窗口的大小关闭得更厉害.在重新调整窗口之前,实际大小是未知的,在运行OnLoad()方法时完成.

稍后调用它会产生视觉伪像,用户实际上可以看到窗口在屏幕上移动.所以只有一个地方,即表单的OnLoad()方法/ Load事件处理程序.但它已经发生在那里,当它被设置为CenterScreen时应用StartPosition属性.所以没有剩下的理由要自己打电话.它应该是一种私有方法,当然很难在以后修复这样的设计错误.