C# Control Basics 1 | Comprendre et parcourir le contrôle de la barre de menus ToolSplit d'un point de vue polymorphe

1. Contexte de l'article

1. Description simple du polymorphisme

  • Le polymorphisme est le même comportement avec des conséquences différentes. Par exemple, ils "aboient" tous, mais les chiens et les chats ont des aboiements et des ondes sonores différents.
  • Le polymorphisme est indissociable de la surcharge, utilisant la surcharge d'une méthode pour réaliser ses propres fonctions dans des classes dérivées. En C#, chaque type est polymorphe car tous les types, y compris les types définis par l'utilisateur, héritent de Object.

2. Application du polymorphisme au développement

  • Lorsque j'ai commencé à apprendre la programmation orientée objet, ma compréhension du polymorphisme était assez abstraite. Je crois que la plupart des étudiants, comme moi, sautent de manière sélective et apprennent la grammaire de base pour écrire les fonctions qu'ils veulent.
    Avec l'approfondissement de l'apprentissage, la complexité des logiciels écrits augmente, et petit à petit j'ai l'impression que le polymorphisme est omniprésent en C#, et c'est un gouffre qu'il faut éviter lors de l'apprentissage de la programmation orientée objet.
  • Lorsque nous commençons avec des frameworks, le polymorphisme est un must.
  • Plus tard, quand j'aurai le temps, je publierai le concept et la pratique du polymorphisme dans le framework de développement.

3. Pourquoi ToolSplit

  • Aujourd'hui, lors du tri des programmes précédents, j'ai optimisé la fonction de commutation chinois-anglais et j'ai envoyé un article basé sur mes sentiments. ToolSplit est implémenté en utilisant le polymorphisme, et sa compréhension vous donnera une bonne compréhension du polymorphisme.
  • ToolSplit est un contrôle packagé par Microsoft. En principe, nous ne développons qu'au niveau de l'application, et nous ne devons pas nous arrêter à l'application, mais également comprendre comment la roue est fabriquée.
  • L'application doit comprendre le principe de développement, et le développement doit être appliqué par soi-même afin de maximiser ses capacités.
  • En traversée, nous devons savoir quel type d'élément est traversé, cela nous permet donc simplement de pratiquer et d'approfondir notre compréhension

2. Introduction des classes connexes (extrait de l'officiel)

1.Contrôle

  • 继承:Objet - MarshalByRefObject - Composant - Contrôle
  • Dérivation : essentiellement la classe parente directe ou indirecte de tous les contrôles
  • Fonction : Définit la classe de base des contrôles, qui sont des composants avec des représentations visuelles.
  • Sécurité des threads : si un handle vers le contrôle a été créé, seuls les membres suivants sont thread-safe : BeginInvoke(Delegate), EndInvoke(IAsyncResult), InvokeRequiredInvoke(Delegate)
    et CreateGraphics(). Appeler CreateGraphics() avant de créer le handle du contrôle sur un thread d'arrière-plan
    peut entraîner un appel inter-thread illégal.

2.ToolStrip

  • 继承:Objet - MarshalByTefObject - Composant - Contrôle -
    ScrollableControl - ToolStrip
  • Dérivé de : System.Windows.Forms.ToolStripDropDown,
    System.Windows.Forms.MenuStrip, etc.
  • Fonction : barre de menu, qui fournit un conteneur pour le menu de premier niveau. Il est généralement utilisé avec le contrôle ToolStripContainer (panneau supérieur), ajoutez le ToolStrip au ToolStripContainer, puis ajoutez le ToolStripContainer à la collection de contrôles du formulaire.
  • Attribut : ToolStripItemCollection Items, la collection de contrôles de la barre de menus de premier niveau

3.ToolStripItemCollection

  • Héritage : Object - ArrangedElementCollection - ToolStripItemCollection Dérivation :
    ListBindableAttribute
  • Fonction : classe de collection d'éléments de bande d'outils, le type de ToolStrip.Items, utilisé pour stocker la classe de collection de type ToolStripItem.
  • Attribut : il possède un attribut A de type ToolStripItem[] privé, qui stocke la fonction de menu ajoutée et est utilisé par l'indexeur pour indexer l'indexeur :
public virtual ToolStripItem this[int index] {
    
     get; }     
public virtual ToolStripItem this[string key] {
    
     get; }  
  • Méthode : Add - Ajoute un ToolStripItem à la propriété privée A. Surcharge 4.

4.ToolStripItem

  • 继承:Objet - MarshalByRefObject - Composant - BindableComponent - ToolStripItem
  • Dérivation : Pas de fonction de menu enfant - ToolStripButton, ToolStripControlHost, ToolStripLabel, ToolStripSeparator, classe parent ToolStripDropDownItem avec fonction de menu enfant
  • Function : l'abstrait de la classe parente de toutes les fonctions du menu de premier niveau

5.ToolStripDropDown

  • 继承:Object - MarshalByRefObject - Component - Control -
    ScrollableControl - ToolStrip - ToolStripDropDown
  • 派生:System.Windows.Forms.ToolStripDropDownMenu 、
    System.Windows.Forms.ToolStripOverflow
  • Fonction : Représente un contrôle qui permet à l'utilisateur
    de sélectionner un seul élément dans la liste affichée lorsque le ToolStripDropDownButton est cliqué. Il peut être compris comme un conteneur pour les menus au-dessus du deuxième niveau
  • Attribut : ToolStripItemCollection Items, une collection de contrôles au-dessus du menu secondaire

6.ToolStripDropDownItem

  • Héritage : Object - MarshalByRefObject - ToolStripItem -
    ToolStripDropDownItem On peut voir que la classe parent du menu de second niveau est dérivée de la classe parent du menu de premier niveau, donc les fonctions du menu de second niveau telles que ToolStripDropDownButton peuvent également être ajouté au menu de premier niveau
  • Dérivation : Possède des classes de fonctions de menu de sous-niveau - ToolStripDropDownButton, ToolStripMenuItem, ToolStripSplitButton
  • Fonction : Classe parent avec fonction de menu enfant : contrôle ToolStripDropDown, ToolStripDropDownButton ou ToolStripMenuItem, affiche les fonctions de base du contrôle ToolStripSplitButton. Semblable à ToolStripItem ne fournissant aucun menu enfant

3. Cas

1. Menu de déclaration dynamique (bien sûr, il peut être ajouté par configuration)

private ToolStrip toolStrip1; //菜单栏
private ToolStripContainer toolStripContainer1; //面板,放于顶部存放toolStrip1
private ToolStripDropDown dropDown; //按扭ToolStripDropDownButton弹出来的子菜单容器,二级菜单
private ToolStripDropDown dropDown2; //按扭ToolStripDropDownButton弹出来的子菜单容器,三级菜单

2. Ajouter des sous-éléments au menu dynamique (de même, vous pouvez les ajouter par configuration)

     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. Parcourez le menu de premier niveau

 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. Parcourir les menus de deuxième niveau et supérieurs

/// <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. Le formulaire de configuration est le suivant

insérez la description de l'image ici

4. Les résultats de course sont les suivants

insérez la description de l'image ici
Peu importe combien et combien, vous pouvez traverser avec succès

4. Résumé

1. Analyse des types

  • C'est vraiment paresseux, voici une brève description sans dessiner un diagramme de classes.
  • Classe de contrôle de conteneur : ToolStrip, ToolStripDropDown, le premier est le conteneur de la barre de menus entière (c'est-à-dire le conteneur de la barre de menus de premier niveau), le second est le conteneur de menu de deuxième niveau et supérieur, et le premier est la classe parente du dernier. Ils ont l'attribut commun Items, qui stocke la classe de fonction de menu
  • Classe de fonctions de menu : principalement divisée en deux catégories, une classe n'a pas de menus de sous-niveau, tels que : ToolStripButton, ToolStripControlHost, ToolStripLabel, ToolStripSeparator, sa classe parente est ToolStripItem, et l'autre classe a ses propres enfants, tels que ToolStripDropDownButton, ToolStripMenuItem, ToolStripSplitButton , dont la classe parent est ToolStripDropDownItem, ils ont le même attribut : DropDown, qui stockent leurs propres conteneurs de menu enfant.
  • Classe de collection de classes de fonctions de menu : ToolStripItemCollection, cette classe est le type de la propriété Items du conteneur ToolStrip et ToolStripDropDown. Il a un attribut A list de type ToolStripItem[], qui a une surcharge de la méthode Add, qui est utilisée pour ajouter le type ToolStripItem à l'attribut A list, et définit un indexeur pour obtenir la valeur de l'attribut A list

2. La beauté du polymorphisme

  • Si nous nous laissons configurer nous-mêmes le contrôle ToolStrip, nous devons d'abord clarifier les exigences : des boutons avec de nombreuses fonctions peuvent être ajoutés, et certains boutons ont leurs propres sous-menus. De même, les sous-menus peuvent également ajouter le même type de boutons, matriochka sans fil ...
  • À partir du conteneur, il est recommandé d'avoir deux types de conteneurs, car le conteneur peut être vu par le contrôle. Bien sûr, le conteneur de premier niveau est une ligne horizontale commune sur la barre de menu supérieure, et les conteneurs de second niveau et les conteneurs ci-dessus sont l'arrangement de style fenêtre contextuelle, et les deux conteneurs ont trop de similitudes, telles que les éléments, qui ont des attributs du type ToolStripItemCollection, etc., utilisez donc le polymorphisme pour écrire leurs points communs dans la même classe parent, afin que vous puissiez comprendre ToolStripItem et ToolStripDropDownItem et leurs
    classes dérivées, et que ToolStripItem est la classe parente de ToolStripDropDownItem, on peut comprendre que ToolStripDropDownItem est un ToolStripItem spécial, car il hérite non seulement des propriétés de ToolStripItem, mais possède également ses propres propriétés (DropDown )

3. Réglage récursif

Il y a deux traversées ici, principalement compte tenu de la particularité du menu de premier niveau. Bien sûr, ToolStrip lui-même est la classe parente de ToolStripDropDown, et il peut être parcouru complètement avec une récursivité. Les étudiants intéressés peuvent l'essayer par eux-mêmes.

Remarque :
La réimpression de cet article doit indiquer la source !
Gu Zipeng : [email protected]

Je suppose que tu aimes

Origine blog.csdn.net/a1062484747/article/details/130017050
conseillé
Classement