public virtual ToolStripItem this[int index] { get; }
public virtual ToolStripItem this[string key] { get; }
方法:Add-添加一个 ToolStripItem 到私有属性A中。重载4个。
4.ToolStripItem
继承:Object - MarshalByRefObject - Component - BindableComponent - ToolStripItem
派生:无子级菜单功能 -ToolStripButton、ToolStripControlHost、ToolStripLabel、ToolStripSeparator,拥有子级菜单功能的父类ToolStripDropDownItem
功能:一级菜单所有功能的父类abstract
5.ToolStripDropDown
继承:Object - MarshalByRefObject - Component - Control -
ScrollableControl - ToolStrip - ToolStripDropDown
派生:System.Windows.Forms.ToolStripDropDownMenu 、
System.Windows.Forms.ToolStripOverflow
功能: 表示一个控件,允许用户在单击 ToolStripDropDownButton
时从显示的列表中选择单个项。可以理解为二级以上菜单的容器
属性: ToolStripItemCollection Items,二级菜单以上的控件集合
6.ToolStripDropDownItem
继承:Object - MarshalByRefObject - ToolStripItem -
ToolStripDropDownItem,由此可见二级菜单父类由一级菜单父类派生,所以二级菜单功能如ToolStripDropDownButton也可以填加到一级菜单中
派生:拥有子级菜单功能类 -ToolStripDropDownButton、ToolStripMenuItem、ToolStripSplitButton
功能: 拥有子级菜单功能的父类: ToolStripDropDown、ToolStripDropDownButton 或ToolStripMenuItem 控件时,显示 ToolStripSplitButton的控件的基本功能。类似ToolStripItem提供没有子级菜单
三、案例
1.动态声明菜单(当然可以用配置的方式添加)
private ToolStrip toolStrip1; //菜单栏 private ToolStripContainer toolStripContainer1; //面板,放于顶部存放toolStrip1 private ToolStripDropDown dropDown; //按扭ToolStripDropDownButton弹出来的子菜单容器,二级菜单 private ToolStripDropDown dropDown2; //按扭ToolStripDropDownButton弹出来的子菜单容器,三级菜单
2.动态菜单添加子项(同理可以用配置的方式填加)
private void Form1_Load(object sender, EventArgs e)
{
toolStripContainer1 = new System.Windows.Forms.ToolStripContainer();
toolStrip1 = new System.Windows.Forms.ToolStrip();
dropDown = new ToolStripDropDown();
dropDown2 = new ToolStripDropDown();
//一级菜单
//创建各种类型的子项
ToolStripButton toolStripButton = new ToolStripButton();
toolStripButton.Text = "1-button";
ToolStripLabel toolStripLabel = new ToolStripLabel();
toolStripLabel.Text = "1-text";
ToolStripDropDownButton toolStripDropDownButton = new ToolStripDropDownButton();
toolStripDropDownButton.Text = "1-DownButton";
ToolStripSplitButton toolStripSplitButton = new ToolStripSplitButton();
toolStripSplitButton.Text = "1-splitButton";
ToolStripTextBox toolStripTextBox = new ToolStripTextBox();
toolStripTextBox.Text = "1-textBox";
ToolStripComboBox toolStripComboBox = new ToolStripComboBox();
toolStripComboBox.Text = "1-ComboBox";
//这里使用了参数为string类型的重载
toolStrip1.Items.Add("1-One");
//下面使用的是参数为ToolStripItrm的重载
toolStrip1.Items.Add(toolStripButton);
toolStrip1.Items.Add(toolStripLabel);
toolStrip1.Items.Add(toolStripDropDownButton); //将弹出二级菜单
toolStrip1.Items.Add(toolStripSplitButton);
toolStrip1.Items.Add(toolStripTextBox);
toolStrip1.Items.Add(toolStripComboBox);
// 将ToolStrip添加到ToolStripContainer的顶部面板
toolStripContainer1.TopToolStripPanel.Controls.Add(toolStrip1);
toolStrip1.Dock = DockStyle.Fill;
// 把顶部面板添加到窗体的控件集合里
Controls.Add(toolStripContainer1);
toolStripContainer1.Width = this.Width;
//二级菜单
//创建二级各种类型的子项
ToolStripButton toolStripButton2 = new ToolStripButton();
toolStripButton2.Text = "2-button";
ToolStripLabel toolStripLabel2 = new ToolStripLabel();
toolStripLabel2.Text = "2-text";
ToolStripDropDownButton toolStripDropDownButton2 = new ToolStripDropDownButton();
toolStripDropDownButton2.Text = "2-DownButton";
ToolStripSplitButton toolStripSplitButton2 = new ToolStripSplitButton();
toolStripSplitButton2.Text = "2-splitButton";
ToolStripTextBox toolStripTextBox2 = new ToolStripTextBox();
toolStripTextBox2.Text = "2-textBox";
ToolStripComboBox toolStripComboBox2 = new ToolStripComboBox();
toolStripComboBox2.Text = "2-ComboBox";
//添加二级菜单项到二级菜单容器
dropDown.Items.Add(toolStripButton2);
dropDown.Items.Add(toolStripLabel2);
dropDown.Items.Add(toolStripDropDownButton2);
dropDown.Items.Add(toolStripSplitButton2);
dropDown.Items.Add(toolStripTextBox2);
dropDown.Items.Add(toolStripComboBox2);
//把二级菜单容器绑定到一级菜单某个项
toolStripDropDownButton.DropDown = dropDown;
//三级菜单
//创建三级各种类型的子项
ToolStripButton toolStripButton3 = new ToolStripButton();
toolStripButton3.Text = "3-button";
ToolStripLabel toolStripLabel3 = new ToolStripLabel();
toolStripLabel3.Text = "3-text";
ToolStripDropDownButton toolStripDropDownButton3 = new ToolStripDropDownButton();
toolStripDropDownButton3.Text = "3-DownButton";
ToolStripSplitButton toolStripSplitButton3 = new ToolStripSplitButton();
toolStripSplitButton3.Text = "3-splitButton";
ToolStripTextBox toolStripTextBox3 = new ToolStripTextBox();
toolStripTextBox3.Text = "3-textBox";
ToolStripComboBox toolStripComboBox3 = new ToolStripComboBox();
toolStripComboBox3.Text = "3-ComboBox";
//添加三级菜单项到三级菜单容器
dropDown2.Items.Add(toolStripButton3);
dropDown2.Items.Add(toolStripLabel3);
dropDown2.Items.Add(toolStripDropDownButton3);
dropDown2.Items.Add(toolStripSplitButton3);
dropDown2.Items.Add(toolStripTextBox3);
dropDown2.Items.Add(toolStripComboBox3);
//把三级菜单容器绑定到二级菜单某个项
toolStripDropDownButton2.DropDown = dropDown2;
}
3.遍历一级菜单
private void button1_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
//遍历一级菜单
foreach (ToolStripItem item in toolStrip1.Items)
{
listBox1.Items.Add(item.Text);
//判断该项是否为二级菜单
if (item is ToolStripDropDownItem)
{
listBox1.Items.Add("");
listBox1.Items.Add("以下是" + item.Text + "的子项☞");
ToolStripDropDownItem toolStripDropDownItem = item as ToolStripDropDownItem;
TracerseToolStrip(toolStripDropDownItem);
listBox1.Items.Add("以上是" + item.Text + "的子项☜");
listBox1.Items.Add("");
}
}
}
4.遍历二级及以上菜单
/// <summary>
/// 递归遍历二级以上菜单
/// </summary>
/// <param name="toolStripItem"></param>
private void TracerseToolStrip(ToolStripDropDownItem toolStripItem)
{
foreach (ToolStripItem item in toolStripItem.DropDownItems)
{
listBox1.Items.Add(item.Text);
//判断该项是否为二级菜单
if (item is ToolStripDropDownItem)
{
listBox1.Items.Add("");
listBox1.Items.Add("以下是" + item.Text + "的子项☞");
ToolStripDropDownItem toolStripDropDownItem = item as ToolStripDropDownItem;
TracerseToolStrip(toolStripDropDownItem);
listBox1.Items.Add("以上是" + item.Text + "的子项☜");
listBox1.Items.Add("");
}
}
}
}
4.配置窗体如下

4.运行结果如下

4.运行结果如下
不管多少及,都能遍历成功
四、总结
1.类型分析
属实偷懒,这里就简单描述一下不画类图了。
容器控件类:ToolStrip、ToolStripDropDown,前者为整个菜单栏的容器(即一级菜单栏容器),后者为二级及以上的菜单容器,且前者为后者的父类。它们拥有共同属性Items,存放菜单功能类
菜单功能类:主要分两大类,一类不拥有子级菜单,如:ToolStripButton、ToolStripControlHost、ToolStripLabel、ToolStripSeparator,其父类是ToolStripItem,另一类则有用自己的子级,如ToolStripDropDownButton、ToolStripMenuItem、ToolStripSplitButton,其父类是ToolStripDropDownItem,它们拥有同一个属性:DropDown,存放他们自己子级菜单容器。
菜单功能类集合类:ToolStripItemCollection,该类是容器ToolStrip和ToolStripDropDown的属性Items的类型。其有一个ToolStripItem[]类型的属性A列表,其有一个Add方法的重载,用于添加ToolStripItem类型到属性A列表里,并定义了索引器来获得属性A列表的值
2.多态的妙处
如果让我们自己来设置ToolStrip控件,首先明确要求:能添加很多种功能的按钮,有些按钮还有自己的子菜单,同理子菜单也能添加同样种的按钮,无线套娃…
从容器上出发,建议拥有两种容器,因为容器是控件能看得见的,一级容器当然是我们常见的一整条在最上面菜单栏式的横排,二级及以上的容器就是弹窗式的列排,而两种容器相同出太多,如都有ToolStripItemCollection类型的属性Items等,所以使用多态把它们共同点写到同一个父类里面
那么可以理解ToolStripItem和ToolStripDropDownItem以及它们派生的类,而ToolStripItem是ToolStripDropDownItem的父类,可以理解ToolStripDropDownItem是一个特殊的ToolStripItem,因为它不但继承了ToolStripItem的属性,而且它还有自己的属性(DropDown)
3.递归设置
这里分两次遍历,主要考虑到一级菜单的特殊性。当然ToolStrip本身就是ToolStripDropDown的父类,用一个递归也能全部遍历完。有兴趣的同学可以自己尝试一下。
4.运行结果如下
不管多少及,都能遍历成功
四、总结1.类型分析属实偷懒,这里就简单描述一下不画类图了。容器控件类:ToolStrip、ToolStripDropDown,前者为整个菜单栏的容器(即一级菜单栏容器),后者为二级及以上的菜单容器,且前者为后者的父类。它们拥有共同属性Items,存放菜单功能类菜单功能类:主要分两大类,一类不拥有子级菜单,如:ToolStripButton、ToolStripControlHost、ToolStripLabel、ToolStripSeparator,其父类是ToolStripItem,另一类则有用自己的子级,如ToolStripDropDownButton、ToolStripMenuItem、ToolStripSplitButton,其父类是ToolStripDropDownItem,它们拥有同一个属性:DropDown,存放他们自己子级菜单容器。菜单功能类集合类:ToolStripItemCollection,该类是容器ToolStrip和ToolStripDropDown的属性Items的类型。其有一个ToolStripItem[]类型的属性A列表,其有一个Add方法的重载,用于添加ToolStripItem类型到属性A列表里,并定义了索引器来获得属性A列表的值2.多态的妙处如果让我们自己来设置ToolStrip控件,首先明确要求:能添加很多种功能的按钮,有些按钮还有自己的子菜单,同理子菜单也能添加同样种的按钮,无线套娃…从容器上出发,建议拥有两种容器,因为容器是控件能看得见的,一级容器当然是我们常见的一整条在最上面菜单栏式的横排,二级及以上的容器就是弹窗式的列排,而两种容器相同出太多,如都有ToolStripItemCollection类型的属性Items等,所以使用多态把它们共同点写到同一个父类里面那么可以理解ToolStripItem和ToolStripDropDownItem以及它们派生的类,而ToolStripItem是ToolStripDropDownItem的父类,可以理解ToolStripDropDownItem是一个特殊的ToolStripItem,因为它不但继承了ToolStripItem的属性,而且它还有自己的属性(DropDown)3.递归设置这里分两次遍历,主要考虑到一级菜单的特殊性。当然ToolStrip本身就是ToolStripDropDown的父类,用一个递归也能全部遍历完。有兴趣的同学可以自己尝试一下。————————————————版权声明:本文为CSDN博主「谷子彭」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/a1062484747/article/details/130017050