如何在程序化添加菜单时去除垂直空间?

5
我在我的表单中添加了一个MenuStrip,我想像往常一样在它下面添加其他控件。Point(0, 0)是空白表单空间的左上角。在我将菜单添加到表单并添加更多控件后,它们会重叠在一起。因此,我想要为菜单减少一些客户端矩形的高度,并且一个Location = (0,0)的按钮必须位于菜单正下方我该如何做到这一点? 如果我将MainMenu分配给表单的Menu属性,则会自动执行此操作,但我确实希望并需要使用MenuStrip。
编辑:这不起作用:
MenuStrip menu = new MenuStrip();
menu.Items.Add("File");
menu.AutoSize = false;
menu.Height = 50;
menu.Dock = DockStyle.Top;
MainMenuStrip = menu;
Controls.Add(menu);

Button b = new Button();
b.Text = "hello world";
b.SetBounds(0, 25, 128, 50);
Controls.Add(b);

虽然MenuStrip可以按照我的期望工作:

Menu = new MainMenu();
Menu.MenuItems.Add("File");

Button b = new Button();
b.Text = "hello world";
b.SetBounds(0, 0, 128, 50);
Controls.Add(b);

你尝试过使用 Dock 吗?如果你将它们全部加上 DockStyle.Top,它们将会垂直堆叠(别忘了反转插入顺序来更改它们的索引)。 - Adriano Repetti
2
顺便提一下:该窗体也有一个MainMenuStrip属性。 - Adriano Repetti
@Adriano 是的,但这并没有帮助。如果您看到示例,按钮将位于菜单下方。 - Bitterblue
因为你明确将其边界设置在菜单下方!试试以下情况会发生什么:1)不使用SetBounds。2)使用Y >= 50的SetBounds(现在你设置为25!)。3)不使用SetBounds,并且对按钮也使用DockStyle.Top(无论是否自动调整大小)... - Adriano Repetti
2个回答

1
在MenuStrip和Panel中都使用DockStyle.Top,但是按相反的顺序添加它们。将Dock=Top的控件添加到最后一个控件最靠近边框,也就是在所有其他控件的顶部。因此,不需要使用私有常量和事件处理程序:
MenuStrip menu = new MenuStrip() {
  AutoSize = false,
  Dock = DockStyle.Top
};
menu.Items.Add("File");

Panel p = new Panel(){
   Dock = DockStyle.Top
};

Controls.Add(p);
Controls.Add(menu);
MainMenuStrip = menu;

Button b = new Button(){
  Text = "hello world"
};
p.Controls.Add(b);
b.SetBounds(0, 0, 128, 50);

1
当你使用SetBounds(0, 25, 128, 50)时,实际上是将b.Top设置为25(第二个参数)。要相对于menu控件设置顶部边界,请使用:
b.SetBounds(0, menu.Bottom, 128, 50);

[更新]
或者你可以使用:
public partial class Form1 : Form
{
    private int menuStripHeight = 50;

    public Form1()
    {
        InitializeComponent();
        this.ControlAdded += Form1_ControlAdded;

    }

    private void Form1_Load(object sender, EventArgs e)
    {
        MenuStrip menu = new MenuStrip();
        menu.Items.Add("File");
        menu.AutoSize = false;
        menu.Height = menuStripHeight; ;
        menu.Dock = DockStyle.Top;
        MainMenuStrip = menu;
        Controls.Add(menu);

        Button b = new Button();
        b.Text = "hello world";

        // note that the position used is 0,0
        b.SetBounds(0, 0, 128, 50);

        Controls.Add(b);
    }

    void Form1_ControlAdded(object sender, ControlEventArgs e)
    {
        if (e.Control.GetType().FullName != "System.Windows.Forms.MenuStrip")
            e.Control.Top += menuStripHeight;
    }
}

[UPDATE 2]
或者您可以使用一个面板
MenuStrip menu = new MenuStrip();
menu.Items.Add("File");
menu.AutoSize = false;
menu.Height = menuStripHeight; ;
menu.Dock = DockStyle.Top;
MainMenuStrip = menu;
Controls.Add(menu);

Panel p = new Panel();
p.SetBounds(0, menuStripHeight, this.Width, this.Height);
Controls.Add(p);

Button b = new Button();
b.Text = "hello world";
p.Controls.Add(b);
b.SetBounds(0, 0, 128, 50);

我知道那里该怎么做。但是我需要新的控件将y位置设置为0,并位于菜单下方。而且它必须是MenuStrip。我希望有一个小技巧可以实现这个。 - Bitterblue
更新是一个有趣的想法,但当我在添加后设置控件位置时,它不起作用(我肯定会这样做)。或者你也有解决方法吗? - Bitterblue
1
你需要直接将控件添加到窗体的控件集合中吗?为什么不在菜单栏下面使用一个“Panel”并将所有控件添加到其中呢?这样,您应该可以获得所需的使用效果。 - Alex Filipovici
1
@mini-me:“我知道我在那里做什么。”-- 我对此表示怀疑。我认为你有些事情没有告诉我们。 - siride
我会选择更新2。@siride,我怎么不知道我正在将b.top设置为25?唯一我没有说的是,我有一个需要构建菜单的工作应用程序。 - Bitterblue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接