我有一个无边框表单(FormBorderStyle = None),高度为23像素(在设计器中设置)
当 .NET 在运行时绘制我的表单时 - 它会绘制它38像素高(由于某种原因它增加了标题栏的高度)。
MessageBox.Show(this.Height.ToString()); //this shows 38!! why?
为了解决这个问题,我必须设置“Height = 23;”在 Form_Load 事件中。
private void MyForm_Load(object sender, EventArgs e)
{
this.Height = 23; //workaround. wtf??
}
您可以在 Visual Studio 2010(Winforms 应用程序,目标框架 - 2.0)中自行尝试。
Wtf?
是的,这是一个错误。请注意在设计器中如何使用“宽度”和“高度”属性设置表单的大小。这些属性包括边框和标题栏的大小。然而,这是一个问题,您的表单可能会在用户增加了标题栏字体大小的计算机上运行。这样就会减少窗口客户区的大小。或者换句话说,表单的 ClientSize 属性将在该计算机上发生更改。为控件留下的空间更少,并且严重扰乱了表单的设计。
Form 类中有运行的代码afterHandle 是在 Load 事件运行之前创建的。它使用您计算机上的相同 ClientSize 重新计算表单的大小。现在一切都很好,表单的高度与您在设计器中设置的高度不匹配,但表单在其他方面看起来相同,并且控件的布局也相同。
相同的代码还确保窗口不会变得太小。这就是它失败的地方,它没有对 FormBorderStyle 属性给予足够的关注。正如您所发现的,将高度剪裁为标题栏大小加上客户区高度。它还可以防止表单变得太窄,试图确保图标和最小/最大/关闭按钮始终可见。即使你没有。
解决方法是在此代码运行后更改 ClientSize,OnLoad 重写或 Load 事件处理程序是正确的位置。请注意,如果您像这样硬编码表单大小,那么您还应该将 AutoScaleMode 属性设置为 None。确保这不会在具有不同 DPI 设置的计算机上造成问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)