Форма с 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
о) или я не могу; Я считаю, что это имеет дело с дизайнером, генерирующим новый код. Независимо от этого, это приводит к сокращению формы.
Вот несколько фотографий, показывающих это в действии:
Первоначальный вид формы, перед сборкой, с размерами 300 на 300.
После первой перестройки. Это не очевидно, но размер теперь 300 на 280. Проверьте полосу прокрутки.
После второго восстановления. Форма теперь 300 на 260, и это более очевидно.
После третьего перестроения. Теперь, когда это 300 на 240, форма становится меньше.
После еще нескольких перестроек я остаюсь с этой приятной легкой в использовании формой 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.