Winforms 设置某些属性时,设计器会自动重新调整窗体大小

Winforms 设置某些属性时,设计器会自动重新调整窗体大小,winforms,visual-studio,Winforms,Visual Studio,我面临一个问题,每次打开设计器时,WinForms窗体都会自动重新调整大小 这似乎只发生在特定的设置中,但是可以通过以下步骤轻松复制 在visual studio中创建新项目 默认的表单大小是300x300,但不管您如何设置它来做注释 将FormBorderStyle属性设置为FixedSingle 将ShowIcon属性设置为false 将ControlBox属性设置为false 保存更改 关闭设计器 重新打开设计器,您会注意到表单缩小了4个像素(宽度和高度) 我遇到的问题是,当它发生时,它不

我面临一个问题,每次打开设计器时,WinForms窗体都会自动重新调整大小

这似乎只发生在特定的设置中,但是可以通过以下步骤轻松复制

  • 在visual studio中创建新项目
  • 默认的表单大小是300x300,但不管您如何设置它来做注释
  • FormBorderStyle
    属性设置为
    FixedSingle
  • ShowIcon
    属性设置为
    false
  • ControlBox
    属性设置为
    false
  • 保存更改
  • 关闭设计器
  • 重新打开设计器,您会注意到表单缩小了4个像素(宽度和高度)
  • 我遇到的问题是,当它发生时,它不会调整任何控件的大小(即,设置了锚定的控件),因此这意味着我最终会遇到与表单边缘重叠的控件,每次打开设计器时都需要手动重新调整所有内容,这是一件痛苦的事情

    所以问题是:为什么会发生这种情况,我能做些什么来阻止它发生



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

    我看到了,这在任何VS版本中都应该是一个bug。这是由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上有不同的边界,它们更胖。不确定是什么激发了这段代码,可能与Windows98有关

    问题是,Size属性是一个计算值,Winforms设计器只存储ClientSize属性。因此,当ShowIcon为False时,它应该重新进行此计算,而不是

    您可以在connect.microsoft.com上报告该漏洞,但microsoft修复该漏洞的几率非常低,因此这可能是在浪费您的时间。有一个非常简单的解决方法,与其在属性窗口中将ShowIcon设置为False,不如在构造函数中执行。像这样:

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

    我可以用你的步骤复制这个。它只执行一次,您可以在不更改大小的情况下多次打开或关闭设计器。但是,一旦更改窗体上的任何内容(例如添加控件、更改大小等),然后保存并再次关闭和打开,窗体将再次缩小4像素。真奇怪。顺便说一句,我正在使用Visual Studio 2010 Professional。@JohnWillemse:是的,这很奇怪,而且还不止于此。在试图找到修复方法时,我注意到一些其他设置将允许表单保持相同的大小,但表单的内容会被调整大小(锚定控件)。我现在还不会通过添加过程来夸大这个问题。谢谢你在2010年确认了这个问题是的,当然可以。我不知道如何验证您的理由,但尺寸计算理由是有道理的,而且解决方案肯定有效。我没想到微软会解决这个问题,我也没想到会在这里得到很多回应,所以谢谢你提供了这么好的解决方案和很好的答案!谢谢