设置某些属性时,Designer会自动重新调整表单大小

时间:2014-02-21 10:36:07

标签: winforms visual-studio

我遇到的问题是每次打开设计器时都会自动调整WinForms表单的大小。

这似乎仅在某个设置中发生,但可以通过以下步骤轻松复制...

  1. 在visual studio中创建一个新项目
  2. 默认表单尺寸为300 x 300,但无论您将其设置为记笔记
  3. FormBorderStyle属性设置为FixedSingle
  4. ShowIcon属性设置为false
  5. ControlBox属性设置为false
  6. 保存更改
  7. 关闭设计师
  8. 重新打开设计师,您会发现表单缩小了4个像素(宽度和高度)
  9. 我遇到的问题是,当它发生时它不会调整任何控件(即使用锚点设置的控件)的大小,所以这意味着我最终会得到与表单边缘重叠的控件,所有内容都需要手动完成每当我打开设计师时都会重新调整,这很痛苦。

    所以问题是:为什么会发生这种情况,我该怎么做才能阻止它发生?


    我目前正在使用Visual Studio 2012 Professional,John Willemse已通过评论确认此问题也存在于Visual Studio 2010 Professional中。

1 个答案:

答案 0 :(得分:8)

我明白了,这应该是任何VS版本中的错误。它是由ShowIcon属性引起的,设计者在将其设置为False时无法正确处理。问题是Form类中的一些代码如下所示:

       FormBorderStyle borderStyle = FormBorderStyle;
       if (!ShowIcon &&
           (borderStyle == FormBorderStyle.Sizable ||
            borderStyle == FormBorderStyle.Fixed3D ||
            borderStyle == FormBorderStyle.FixedSingle))
       {
           cp.ExStyle |= NativeMethods.WS_EX_DLGMODALFRAME;
       }

换句话说,当ShowIcon为False时,它使用来自WS_BORDER的不同的边框样式,它使用模式对话框。在较旧的Windows版本上有不同的边框,它们更胖。不确定是什么启发了这段代码,可能与Windows 98有关。

问题是,Size属性是计算的值,Winforms设计器只存储ClientSize属性。因此,当ShowIcon为False时,它应重做此计算,它不会。

您可以在connect.microsoft.com上报告错误,但微软要修复它的几率非常低,这可能会浪费您的时间。有一个非常简单的解决方法,而不是在属性窗口中将ShowIcon设置为False,而是在构造函数中执行它。像这样:

    public Form1() {
        InitializeComponent();
        this.ShowIcon = false;
    }