首页 > 解决方案 > TabPage 可以有 MenuStrip 吗?

问题描述

我有一个带有选项卡界面的应用程序。
每个选项卡本质上本身就是一个应用程序。

主菜单包含适用于选项卡 1 内容的选项。
选项卡 2 和选项卡 3 需要完全不同的菜单。

当用户单击不同的选项卡时,如何交换菜单?我是否需要每次都重建主菜单,或者有没有办法让菜单栏与选项卡相关联?

标签: c#winformsmenutabcontrol

解决方案


MenuStrips 和 TabPages 是控件。您可以使用 将控件作为子控件添加到其他控件Control.Controls.Add(...)。用于MenuStrip.Dock将其停靠在所需位置。也许您需要设置 MenuStrip 的大小。

虽然这会起作用,但我不确定这是否明智。人们不希望菜单散布在您的窗口周围。当您选择不同的 TabPage 时更改主菜单不是更好吗?

Let every TabPage have its own MenuStrip, and when a new TabPage is selected, let your form change the menu.

class MyTabPage : TabPage
{
    ...
    public MenuStrip MenuStrip => ...
}

如果您不想创建特殊的 TabPage 类,请考虑使用属性 Tag 来存储 MenuStrip。

在您的表格中:

// probably done in InitializeComponent()
private TabControl tabControl = ...

// access to the TabPages and to the Selected tab:
private IEnumerabl<MyTabPage> TabPages => this.TabControl.TabPages.Cast<MyTabPage>();
private MyTabPage SelectedTabPage => (MyTabPage)this.TabControl.SelectedPage;

// constructor
public MyForm()
{
    InitializeComponent();
    AddTabPages();  // only if needed

    // add the menu strips of all tab pages to this.Controls
    IEnumerable<MenuStrip> menuStrips = this.TabPages
        .Select(tabPage => tabPage.MenuStrip);
    this.Controls.AddRange(menuStrips)

    // get notified when selected tab page changes:
    this.TabControl.SelectedIndexChanged
    tabControl.SelectedIndexChanged += OnTabPageChanged;
}

private MyTabPage SelectedTabPage => (MyTabPage)tabControl.SelectedTab();

private void OnTabPageChanged(object sender, ...)
{
    // change the main menu:
    this.MainMenuStrip = this.SelectedTabPage?.MenuStrip;
}

推荐阅读