2

每当我构建以下程序Form1时,它的大小都会缩小 20。(在某些情况下,我需要对表单进行更改,例如移动someLaggyControl1几个像素,但并非总是如此。这很奇怪。)表单使用 aMainMenu作为菜单, 不是MenuStrip. 是的,MainMenu较旧,不推荐使用,但我需要使用它有几个原因,其中之一是radio-button items。更改为 aMenuStrip对我来说不是一个有效的解决方案。

这是重现此问题所需的代码:

Form1.designer.cs

namespace MainMenuMCVE
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing) {
            if (disposing && (components != null)) {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent() {
            this.components = new System.ComponentModel.Container();
            this.MainMenu1 = new System.Windows.Forms.MainMenu(this.components);
            this.menuItem1 = new System.Windows.Forms.MenuItem();
            this.menuItem2 = new System.Windows.Forms.MenuItem();
            this.menuItem7 = new System.Windows.Forms.MenuItem();
            this.menuItem8 = new System.Windows.Forms.MenuItem();
            this.menuItem3 = new System.Windows.Forms.MenuItem();
            this.menuItem4 = new System.Windows.Forms.MenuItem();
            this.menuItem5 = new System.Windows.Forms.MenuItem();
            this.menuItem6 = new System.Windows.Forms.MenuItem();
            this.someLaggyControl1 = new MainMenuMCVE.SomeLaggyControl();
            this.SuspendLayout();
            // 
            // MainMenu1
            // 
            this.MainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
            this.menuItem1,
            this.menuItem5});
            // 
            // menuItem1
            // 
            this.menuItem1.Index = 0;
            this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
            this.menuItem2,
            this.menuItem3,
            this.menuItem4});
            this.menuItem1.Text = "Example";
            // 
            // menuItem2
            // 
            this.menuItem2.Index = 0;
            this.menuItem2.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
            this.menuItem7,
            this.menuItem8});
            this.menuItem2.Text = "Something";
            // 
            // menuItem7
            // 
            this.menuItem7.Index = 0;
            this.menuItem7.Text = "Another thing";
            // 
            // menuItem8
            // 
            this.menuItem8.Index = 1;
            this.menuItem8.Text = "Ect";
            // 
            // menuItem3
            // 
            this.menuItem3.Index = 1;
            this.menuItem3.Text = "Something else";
            // 
            // menuItem4
            // 
            this.menuItem4.Index = 2;
            this.menuItem4.Text = "A third thing";
            // 
            // menuItem5
            // 
            this.menuItem5.Index = 1;
            this.menuItem5.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
            this.menuItem6});
            this.menuItem5.Text = "Example 2";
            // 
            // menuItem6
            // 
            this.menuItem6.Index = 0;
            this.menuItem6.Text = "Blah";
            // 
            // someLaggyControl1
            // 
            this.someLaggyControl1.Laggyness = 1000;
            this.someLaggyControl1.Location = new System.Drawing.Point(12, 81);
            this.someLaggyControl1.Name = "someLaggyControl1";
            this.someLaggyControl1.Size = new System.Drawing.Size(268, 23);
            this.someLaggyControl1.TabIndex = 0;
            this.someLaggyControl1.Text = "someLaggyControl1";
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(292, 253);
            this.Controls.Add(this.someLaggyControl1);
            this.Menu = this.MainMenu1;
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.MainMenu MainMenu1;
        private System.Windows.Forms.MenuItem menuItem1;
        private System.Windows.Forms.MenuItem menuItem2;
        private System.Windows.Forms.MenuItem menuItem3;
        private System.Windows.Forms.MenuItem menuItem4;
        private System.Windows.Forms.MenuItem menuItem5;
        private System.Windows.Forms.MenuItem menuItem6;
        private System.Windows.Forms.MenuItem menuItem7;
        private System.Windows.Forms.MenuItem menuItem8;
        private SomeLaggyControl someLaggyControl1;
    }
}

SomeLaggyControl.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace MainMenuMCVE
{
    class SomeLaggyControl : Control
    {
        public int Laggyness { get; set; }

        protected override void OnPaint(PaintEventArgs e) {
            e.Graphics.DrawString("A laggy control that takes " + Laggyness + " ms to render", this.Font, Brushes.Black, 0, 0);
            System.Threading.Thread.Sleep(Laggyness);
            base.OnPaint(e);
        }
    }
}

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace MainMenuMCVE
{
    public partial class Form1 : Form
    {
        public Form1() {
            InitializeComponent();
        }
    }
}

程序.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace MainMenuMCVE
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

其中的关键部分是一个 Form,Form1它包含一个MainMenu有几个MenuItems 的 a,其中一个有几个 sub- MenuItems。它还包含SomeLaggyControl,(当然)用作示例。 SomeLaggyControl渲染需要 1 秒,用于模拟一堆控件,这样示例就不会变得混乱。

每当我运行程序时,Form1的大小都会缩小。我可能需要对表格进行更改以使其缩小(例如移动someLaggyControl1),或者我可能不会;我相信这必须处理生成新代码的设计器。无论如何,这会导致形式缩小。

这里有一些图片展示了这一点:

表单的原始外观,在构建之前,大小为 300 x 300。
表单的原始外观,在构建之前,大小为 300 x 300。

第一次重建后。 这不是很明显,但现在大小是 300 x 280。检查滚动条。
第一次重建后。这不是很明显,但现在大小是 300 x 280。检查滚动条。

二次重建后。 表格现在是 300 x 260,而且更加明显。
二次重建后。表格现在是 300 x 260,而且更加明显。

第三次重建后。 现在它是 300 x 240,表格越来越小。
第三次重建后。现在它是 300 x 240,表格越来越小。

经过几次重建后,我得到了这个令人愉快的 300 x 47 表格。 表单无法再缩小(尽管它会尝试)。
经过几次重建后,我留下了这张令人愉快的易于使用的 300 x 47 表格。表单无法再缩小(尽管它会尝试)。


我的主要问题是:如何阻止我的表单调整大小(除了切换到 a MenuStrip)?我也对为什么会发生这种情况感兴趣,但这并不重要。

4

2 回答 2

2

旧的菜单系统内置了一些东西,当它在使用设计器时附加到其 Menu 属性时,它会通过菜单系统的高度来增加表单的大小。

要解决此问题,请进入 Designer.cs 文件,注释掉这一行:

// this.Menu = this.MainMenu1;

然后,在 OnLoad 覆盖中,重新附加它:

protected override void OnLoad(EventArgs e) {
  base.OnLoad(e);
  this.Menu = MainMenu1;
}

除非您从表单区域下方的组件托盘中选择该菜单,否则该菜单在设计器中将不可见。您会注意到菜单在表单上变得可见,并且在菜单可见时表单的大小将暂时增加。这似乎可以防止您的表单始终调整自己的大小。

于 2015-02-11T19:01:30.547 回答
0

您可以尝试将 minimumSize 设置为与您希望表单的大小相同。所以表格永远不应该比它小,但可以尽可能大。因此,如果您需要表格为 300,300,请将最小尺寸也更改为 300,300。

于 2015-02-11T18:26:09.943 回答