【问题标题】:Why is my form being resized when it is displayed?为什么我的表单在显示时会调整大小?
【发布时间】:2013-02-14 12:54:36
【问题描述】:

我有一个显示为模式对话框的表单。表单在设计器中如下所示:

(宽度 = 360,高度 = 215)

当它显示在应用程序中时,它会比定义的高和宽 10 像素,在底部和左侧边缘留下很大的边距:

(宽度 = 370,高度 = 225)

表单的尺寸被明确设置为 360x215 像素,边框样式为 FixedDialog,继承自 System.Windows.Forms.Form,并且其中没有用于操作尺寸的代码(自动生成的设计器除外文件)。如果我将边框样式更改为FixedSingleFixedToolWindow,它会显示正确的大小(但我希望它的样式为FixedDialog)。

知道是什么原因造成的吗?


我已通过删除表单上的 MinimumSize 设置来解决此问题。看来,如果将其设置为与 Size 属性相同的大小(或接近,但我还没有完全找到阈值),则会引入边距。由于表单不可调整大小,我不需要设置 MinimumSize 以便将其删除。

我还是不明白为什么会这样。

【问题讨论】:

  • 是否设置了 max 或 min 属性?
  • @CR41G14: 是的,SizeMinimumSizeMaximumSize 都设置为 360, 215
  • 出于好奇,它是否总是被提高到 370x225(无论您使用什么起始尺寸),还是总是在每边添加 10 个像素?您是否尝试过其他窗口大小只是为了查看结果?
  • @jszigeti:不管起始尺寸是多少,它总是增加 10 个像素。
  • 嗯,奇怪,这一定是环境因素。您可以永远指望获得固定大小,该值受主题自定义的影响,例如标题栏字体大小。 Winforms 仅尝试保留 ClientSize。我唯一能想到的是 DpiAware manifest 属性,它可能在设计器和您的程序之间不匹配。

标签: c# .net winforms windows-forms-designer


【解决方案1】:

首先,您的表单似乎将AutoScaleMode 设置为Font。这会导致表单根据使用的字体调整大小。

其次,确保在创建主窗体之前有以下几行:

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);  // Not using this - or using true - will cause a different font rendering
...
Application.Run(new Form1());                          // this creates your main form

(通常这是Program.cs中静态Main方法的一部分)

不使用这些行会导致使用不同的字体渲染(看看你的截图 - 字母看起来并不完全相同!)

【讨论】:

  • 谢谢,这有帮助。将 AutoScaleMode 设置为“dpi”解决了我的问题(它比设计中的要大)。
【解决方案2】:

我的表单也有类似的问题。最后我发现问题出在属性中表单的最大和最小大小。如果你想要一个固定的、不可调整大小的表单,你必须禁用它们。

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    你为什么不暴力破解代码的问题:

    protected override void SetClientSizeCore(int x, int y)
    {
        base.SetClientSizeCore(360, 215);
    }
    

    设置客户区。你需要计算出你想要的值。

    【讨论】:

      【解决方案4】:

      我创建了一个表单,更改了字体并将FormBorderStyle 设置为FixedDialog,但我没有遇到任何问题。只需检查一下您在表单加载时到底设置了什么。

      // this needs to be set as joe said is correct.
      Application.SetCompatibleTextRenderingDefault(false);
      

      如果您可以提供您在 formLoad 方法上编写的代码。这样我就可以尝试纠正问题。

      【讨论】:

        【解决方案5】:

        我通过进入表单“Form1.Designer.cs”取得了一些成功。然后我确定以下代码的最后一个单词是“Normal”:

            this.WindowState = System.Windows.Forms.FormWindowState.Normal;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-09
          • 2019-12-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多