首页 > 编程语言 >C# 控件基础1 | 从多态角度理解、遍历菜单栏控件ToolSplit

C# 控件基础1 | 从多态角度理解、遍历菜单栏控件ToolSplit

时间:2023-11-01 13:11:32浏览次数:45  
标签:控件 菜单 ToolSplit Items 多态 Add Text new

一、文章背景 1.多态简单描述 多态是同一个行为,具有不同的结果。比如都是“叫”,而狗和猫的叫法,声波等形态不一样。 多态离不开重载,利用重载某个方法实现其在派生类自己的功能。 在 C# 中,每个类型都是多态的,因为包括用户定义类型在内的所有类型都继承自Object。 2.多态在开发中的应用 刚开始学习面向对象编程时,对多态理解还是挺抽象的。相信大多数同学和我一样,选择性跳过,学习基本语法也能写出自己想要的功能。 随着学习的深入,写的软件复杂程度增加,渐渐地觉得多态在C#中无处不在,是学习面向对象编程必绕开的坑。 当我们着手框架时,多态是必须的。 后续有时间会出一遍关于多态在开发框架中的理念和实战。 3.为什么是ToolSplit 今天在整理以前程序时,优化中英文切换功能,有感而发的一篇文章。 ToolSplit是使用多态实现的,理解它就能很好地理解多态。 ToolSplit是微软封装好的控件,原则上我们只是应用层面的开发,而我们不能止步于应用,更要了解轮子是怎么造的. 应用需要了解开发原理,开发需要自己去应用,才能在自己的能力发挥到极致。 而在遍历中,必须知道遍历的项是什么类型,所以刚好能让我们实践加深理解 二、相关类的介绍(摘录官方) 1.Control 继承:Object - MarshalByRefObject - Component - Control 派生:基本是所以控件的直接或间接父类 功能: 定义控件的基类,控件是带有可视化表示形式的组件。 线程安全:如果已创建控件的句柄,则只有以下成员是线程安全的:BeginInvoke(Delegate)、EndInvoke(IAsyncResult)、InvokeRequiredInvoke(Delegate)、 和 CreateGraphics() 。 在后台线程上创建控件的句柄之前调用 CreateGraphics() 可能会导致非法的跨线程调用。 2.ToolStrip 继承:Object - MarshalByTefObject - Component - Control - ScrollableControl - ToolStrip 派生: System.Windows.Forms.ToolStripDropDown、 System.Windows.Forms.MenuStrip等 功能:菜单栏,为一级菜单提供容器。其通常配合ToolStripContainer(顶部面板)控件使用,把ToolStrip添加到ToolStripContainer里,然后把ToolStripContainer添加到窗体的控件集合中。 属性: ToolStripItemCollection Items,一级菜单栏的控件集合 3.ToolStripItemCollection 继承:Object - ArrangedElementCollection - ToolStripItemCollection 派生: ListBindableAttribute 功能:工具条项集合类,ToolStrip.Items的类型,用于存放ToolStripItem类型的集合类。 属性:拥有一个私有ToolStripItem[]类型的属性A,存放添加进来的菜单功能,以及供索引器索引 索引器:

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的父类,用一个递归也能全部遍历完。有兴趣的同学可以自己尝试一下。

 

一、文章背景1.多态简单描述多态是同一个行为,具有不同的结果。比如都是“叫”,而狗和猫的叫法,声波等形态不一样。多态离不开重载,利用重载某个方法实现其在派生类自己的功能。 在 C# 中,每个类型都是多态的,因为包括用户定义类型在内的所有类型都继承自Object。2.多态在开发中的应用刚开始学习面向对象编程时,对多态理解还是挺抽象的。相信大多数同学和我一样,选择性跳过,学习基本语法也能写出自己想要的功能。随着学习的深入,写的软件复杂程度增加,渐渐地觉得多态在C#中无处不在,是学习面向对象编程必绕开的坑。当我们着手框架时,多态是必须的。后续有时间会出一遍关于多态在开发框架中的理念和实战。3.为什么是ToolSplit今天在整理以前程序时,优化中英文切换功能,有感而发的一篇文章。 ToolSplit是使用多态实现的,理解它就能很好地理解多态。ToolSplit是微软封装好的控件,原则上我们只是应用层面的开发,而我们不能止步于应用,更要了解轮子是怎么造的.应用需要了解开发原理,开发需要自己去应用,才能在自己的能力发挥到极致。而在遍历中,必须知道遍历的项是什么类型,所以刚好能让我们实践加深理解二、相关类的介绍(摘录官方)1.Control继承:Object - MarshalByRefObject - Component - Control派生:基本是所以控件的直接或间接父类功能: 定义控件的基类,控件是带有可视化表示形式的组件。线程安全:如果已创建控件的句柄,则只有以下成员是线程安全的:BeginInvoke(Delegate)、EndInvoke(IAsyncResult)、InvokeRequiredInvoke(Delegate)、和 CreateGraphics() 。 在后台线程上创建控件的句柄之前调用 CreateGraphics()可能会导致非法的跨线程调用。2.ToolStrip继承:Object - MarshalByTefObject - Component - Control -ScrollableControl - ToolStrip派生: System.Windows.Forms.ToolStripDropDown、System.Windows.Forms.MenuStrip等功能:菜单栏,为一级菜单提供容器。其通常配合ToolStripContainer(顶部面板)控件使用,把ToolStrip添加到ToolStripContainer里,然后把ToolStripContainer添加到窗体的控件集合中。属性: ToolStripItemCollection Items,一级菜单栏的控件集合3.ToolStripItemCollection继承:Object - ArrangedElementCollection - ToolStripItemCollection 派生:ListBindableAttribute功能:工具条项集合类,ToolStrip.Items的类型,用于存放ToolStripItem类型的集合类。属性:拥有一个私有ToolStripItem[]类型的属性A,存放添加进来的菜单功能,以及供索引器索引 索引器:public virtual ToolStripItem this[int index] { get; }     public virtual ToolStripItem this[string key] { get; }  12方法:Add-添加一个 ToolStripItem 到私有属性A中。重载4个。4.ToolStripItem继承:Object - MarshalByRefObject - Component - BindableComponent - ToolStripItem派生:无子级菜单功能 -ToolStripButton、ToolStripControlHost、ToolStripLabel、ToolStripSeparator,拥有子级菜单功能的父类ToolStripDropDownItem功能:一级菜单所有功能的父类abstract5.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; //面板,放于顶部存放toolStrip1private ToolStripDropDown dropDown; //按扭ToolStripDropDownButton弹出来的子菜单容器,二级菜单private ToolStripDropDown dropDown2; //按扭ToolStripDropDownButton弹出来的子菜单容器,三级菜单12342.动态菜单添加子项(同理可以用配置的方式填加)     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;        }12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182833.遍历一级菜单 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("");            }        }    }        123456789101112131415161718194.遍历二级及以上菜单/// <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("");            }        }           }}12345678910111213141516171819202122234.配置窗体如下

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

标签:控件,菜单,ToolSplit,Items,多态,Add,Text,new
From: https://www.cnblogs.com/tyxajh/p/17802873.html

相关文章

  • C#中menuStrip1控件详细使用方法
    在C#中,MenuStrip控件用于创建一个菜单栏,允许用户通过点击菜单项来执行相应的操作。MenuStrip提供了一种方便的方式来创建和管理菜单项及其事件处理程序。以下是MenuStrip控件的详细使用方法:在窗体上放置MenuStrip控件:在VisualStudio的窗体设计器中,从工具箱中拖动并放置一个......
  • streamlit控件和控制1
    streamlit控件和控制目录streamlit控件和控制元素控件状态元素st.button特性切换按钮控制流动态增删元素常见错误参考资料元素控件button: #按钮download_button:#文件下载file_uploader: #文件上传checkbox: #复选框radio: #单选框selectbox: #下拉......
  • streamlit控件和控制2
    streamlit控件和控制2目录streamlit控件和控制2st.radiost.selectboxst.multiselectst.select_sliderst.sliderst.progress参考资料button: #按钮download_button:#文件下载file_uploader: #文件上传checkbox: #复选框toggle:#切换框radio: #......
  • 界面控件DevExpress WinForms Gauge组件 - 实现更高级别数据可视化
    DevExpressWinForms控件包含了超过150个随时可用的仪表盘预设,包括圆形,数字,线性和状态指示器等,来帮助用户实现更高级的数据可视化。DevExpressWinForms有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。同时能完美构建流畅、美观且易于使用的应用程序,无论是......
  • 界面控件DevExpress WPF Gauge组件 - 轻松实现个性化商业仪表盘
    DevExpressWPFGauge(仪表)控件包含了多种圆形仪表类型、水平和垂直线性仪表、分段和矩阵数字仪表以及状态指示器,同时还具有最终用户交互性的集成支持。P.S:DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着......
  • Qt中设置设置控件样式 — setStyleSheet
    通过setStyleSheet来设置控件的Style样式控件样式的常用设置项:1、border:设置控件的边框样式//1.无边框QStringborderNone="border:none";//2.设置边框的值需要有3个因子:宽度,线形,颜色QStringborderStyle="border:5pxsolid#999999;";......
  • 多态的使用以及多态底层的实现(下)
    经过之前的学习我们知道了,继承能够实现多态的原理就是,在继承的父类和子类中各自存在一个虚表,父类和子类的虚表中各自储存了自己的虚函数,不同的点就是如果我们完成了虚函数的重写,那么子类(派生类)虚表中的那个虚函数地址是重写后的虚函数的地址。所以我们虚函数重写还有一个名字就是虚......
  • 多态和多态性
    什么是多态:一类事物的多种形态这是其中的体现比如:动物类:猪,狗,人多态基础classAni0mal:defspeak(self):passclassPig(Animal):defspeak(self):print('哼哼哼')classDog(Animal):defspeak(self):print('汪汪汪'......
  • 请说说qt主要用的控件?信号和槽怎么实现的?
    qt主要用到的控件:QWidget基类,QPushButton普通按钮,QLineEdit文本输入,QSlider滑动条,QLabel显示文本或图像,QMainWindow创建应用程序的主窗口,QCeckBox复选框,QRadioButton单选按钮。 信号和槽的实现:每个控件可以发出信号,其它控件可以连接到这些信号的槽函数,以响应事件。......
  • 类变量,类方法,私有变量,私有方法,继承,多态
    Defrun(self):Print(‘{}在跑’.format(self.name))dog.run()Self说明当前的方法是一个实例方法(类的实例化的方法),将方法绑定到当前的实例上面去。 类变量的调用 类方法的调用 cls是表示类的类型,看成默认的即可。   私有变量    私有方法  ......