Форма с MainMenu сжимается при каждом запуске проекта

Всякий раз, когда я строю следующую программу Form1 размер сокращается на 20. (В некоторых случаях мне нужно внести изменения в форму, такие как перемещение someLaggyControl1 на несколько пикселей, но не всегда. Это странно.) Форма использует MainMenu для меню, а не MenuStrip, Да, MainMenu он старше и не рекомендуется для использования, но мне нужно использовать его по нескольким причинам, одна из которых - переключатели. Меняется на MenuStrip не является правильным решением для меня.

Вот код, необходимый для воспроизведения этой проблемы:

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();
        }
    }
}

Program.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());
        }
    }
}

Ключевой частью этого является форма, Form1, который содержит MainMenu это имеет несколько MenuItem s, один из которых имеет несколько MenuItem s. Он также содержит SomeLaggyControl, который (конечно) используется в качестве примера. SomeLaggyControl рендеринг занимает 1 секунду и используется для эмуляции набора элементов управления, чтобы пример не запутался.

Всякий раз, когда я запускаю программу, Form1 размер сжимается. Мне может понадобиться изменить форму, чтобы она уменьшилась (например, перемещение someLaggyControl1 о) или я не могу; Я считаю, что это имеет дело с дизайнером, генерирующим новый код. Независимо от этого, это приводит к сокращению формы.

Вот несколько фотографий, показывающих это в действии:

The original appearance of the form, before building, with a size of 300 by 300
Первоначальный вид формы, перед сборкой, с размерами 300 на 300.

After the first rebuild.  It's not obvious, but the size is now 300 by 280.  Check the scroll bar
После первой перестройки. Это не очевидно, но размер теперь 300 на 280. Проверьте полосу прокрутки.

After a second rebuild.  The form is now 300 by 260, and it's more obvious
После второго восстановления. Форма теперь 300 на 260, и это более очевидно.

After a third rebuild.  Now that it's 300 by 240, the form is getting small
После третьего перестроения. Теперь, когда это 300 на 240, форма становится меньше.

After several more rebuilds, I am left with this pleasant 300 by 47 form.
The form is unable to shrink anymore (though it tries
После еще нескольких перестроек я остаюсь с этой приятной легкой в ​​использовании формой 300 на 47. Форма больше не может сжиматься (хотя и пытается).


Мой основной вопрос заключается в следующем: как я могу остановить изменение размера моей формы (кроме перехода на MenuStrip)? Мне также интересно, почему это происходит, но это не так уж важно.

2 ответа

Решение

Есть что-то встроенное в эту старую систему меню, которая увеличивает размер формы на высоту системы меню, когда она присоединяется к свойству Menu при использовании дизайнера.

Чтобы обойти это, зайдите в файл Designer.cs, закомментируйте эту строку:

// this.Menu = this.MainMenu1;

Затем в переопределении OnLoad подключите его:

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

Меню не будет отображаться в дизайнере, если вы не выберете его в области уведомлений под областью формы. Вы заметите, что меню становится видимым в форме, а размер вашей формы временно увеличивается, пока меню отображается. Это, кажется, мешает вашей форме всегда измерять себя.

Вы можете попытаться установить минимальный размер, равный размеру, который вы хотите, чтобы форма была. Так что форма никогда не должна становиться меньше, чем эта, но может становиться настолько большой, насколько это необходимо. Так что если вам нужно, чтобы форма была 300 300, измените также и минимальный размер на 300 300.

Другие вопросы по тегам