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

时间:2014-10-18 22:09:33

标签: c# winforms

来自msdn

  

请勿直接从您的代码中调用此方法。而是将StartPosition属性设置为CenterScreen。

任何人都知道为什么?

1 个答案:

答案 0 :(得分:8)

由于通常的原因,当您在MSDN Library中看到此注释时, way 的概率太多,您将使用此错误。代码中只有一个位置,您可以调用此方法并获得预期结果。

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

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

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

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