c# - TabPage 可以有 MenuStrip 吗?
问题描述
我有一个带有选项卡界面的应用程序。
每个选项卡本质上本身就是一个应用程序。
主菜单包含适用于选项卡 1 内容的选项。
选项卡 2 和选项卡 3 需要完全不同的菜单。
当用户单击不同的选项卡时,如何交换菜单?我是否需要每次都重建主菜单,或者有没有办法让菜单栏与选项卡相关联?
解决方案
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;
}
推荐阅读
- bash - Bash 二元运算符的用法
- typescript - 在 Typescript 中使用泛型休息运算符
- game-engine - 在以不同帧速率运行的游戏上准确记录和回放输入/移动
- c++ - 如何在嵌入式设备上通过 UDP 接收数据
- css - R markdown更改PDF的内联代码背景颜色
- asp.net-mvc - 使用 Knockout ko.observableArray([]) foreach 时生成唯一 ID,并且在 Dom 中创建了多个文本框
- c++ - 如果在某个索引处的字符串中有一个数字,我想将它存储为另一个变量,那么为什么我们要做 int n=str[i]-'0'?
- javascript - 合并两个不同大小的Javascript数组
- ruby-on-rails - 连接 Rails 和系统,以便 Rails 可以执行更新 nginx 块等操作
- android - 选项卡式页面和底部导航中的静态标题?