【发布时间】:2014-10-18 22:09:33
【问题描述】:
【问题讨论】:
-
何不自己试试看呢?
-
我正在使用它,它工作正常。我很好奇为什么微软建议不要使用它。 :)
-
在光标所在的屏幕上居中表单,而不是带有焦点应用程序的屏幕是一个问题,但这不仅是对我问题的回答。我接受了似乎有我需要的信息的答案。
【问题讨论】:
由于通常原因,当您在 MSDN 库中看到此注释时,您可能会错误地使用它。代码中只有一个地方可以调用此方法并获得预期结果。
这是由表单的 Size 属性引起的问题。当然,需要知道如何将其居中。太多的程序员把他们在“属性”窗口中看到的值当作信条,他们会假设窗口在用户的机器上也会有这个大小。这种情况很少见。
第一个问题是用户偏好,他们可以改变标题文本和控制按钮的大小。或者他们将启用(或不启用)Aero,从而使窗口边框变宽。这可能会导致 Size 稍微偏离,实际窗口的 Size 在运行时会与您在 Properties 窗口中看到的不同。 Winforms 已经提供了一些东西,它实际上并没有存储您设计的 Size 属性,它存储了 ClientSize 属性。实际大小在创建窗口时才知道,此时 CreateHandle() 方法运行。所以你不能在表单的构造函数中调用 CenterToScreen() 也不能在 Show() 调用之前调用它,太早了。
第二个问题是表单的 AutoScaleMode 属性。最近特别重要的是,许多用户不再以默认设置 96 DPI 运行他们的机器。自 Vista 以来特别容易更改。这将导致窗口的大小更加显着地关闭。实际大小直到窗口重新缩放后才知道,在 OnLoad() 方法运行时完成。
稍后调用它会产生视觉效果,用户实际上可以看到窗口在屏幕上移动。所以只有一个地方,表单的 OnLoad() 方法/Load 事件处理程序。但它已经在那里发生了,这就是当 StartPosition 属性设置为 CenterScreen 时应用的地方。因此,没有任何理由可以自己调用它。本来应该是私有方法,这样的设计错误以后当然很难改正了。
【讨论】: