2009-02-13 7 views
0

J'ai une barre d'outils qui contient un ToolStripDropDownButton. En tant que méthode d'accès alternative, j'aimerais aussi pouvoir afficher le menu déroulant de ce bouton en tant que menu contextuel, lorsque l'utilisateur clique avec le bouton droit de la souris dans la zone située sous la barre d'outils.Afficher le menu pour un ToolStripDropDownButton en tant que menu contextuel

J'ai essayé le code suivant, mais il ne fonctionne pas (il affiche le menu déroulant du bouton dans la position normale, directement sous le bouton):

Point contextMenuLocation = [get from WM_CONTEXTMENU] 
myButton.DropDown.Show(contextMenuLocation); 

La meilleure idée que je peux penser serait de copiez les éléments de la barre d'outils à partir de la liste déroulante du bouton dans un ContextMenuStrip, mais je ne vois pas de moyen simple de le faire (ToolStripItem n'implémente pas ICloneable ou une méthode Clone). Les éléments de la barre d'outils stockent une référence à leur Parent, donc je ne peux pas simplement ajouter les éléments existants au menu contextuel, car cela casserait le bouton.

Est-ce que quelqu'un a une bonne idée sur la façon d'accomplir cela?

Répondre

2

Une bonne façon de remplir deux listes déroulantes différentes avec les mêmes éléments est d'extraire la création d'éléments dans une fonction qui génère la liste déroulante nécessaire juste avant d'ouvrir une instance de cette liste déroulante. Cela vous permet également d'activer une désactivation si l'état de l'application change.

class A 
{ 
    public A() 
    { 
     button = new ToolStripDropDownButton(); 
     button.DropDown = new ToolStripDropDown(); 

     ToolStripDropDown dropDown = new ToolStripDropDown(); 
     dropDown.Opening += DropDownOpening; 
     menu.Items.DropDown = dropDown; 

    } 

    void DropDownOpening(object sender, EventArgs e) 
    { 
     ToolStripDropDown dropDown = sender as ToolStripDropDown; 
     if(dropDown != null) 
     { 
      dropDown.Items.Clear(); 
      BuildMenu(dropDown); 
     } 
     else 
     { 
      // throw if you like 
     } 
    } 

    void BuildMenu(ToolStripDropDown dropDown) 
    { 
     // TODO : Add items to dropdown 
     // TODO : Take decisions depending on current application state 
    } 

    ToolStripDropDownButton button; 
    MenuStrip menu; 
} 
+0

Merci pour l'idée. J'avais pensé à faire ça, et je pourrais finir par aller dans ce sens. Je suis toujours intéressé de savoir s'il existe un moyen facile de le faire sans remplir le menu dynamiquement, par ex. pour les cas où le menu est construit via le concepteur. – Charlie

+0

Je ne trouve pas d'autre bonne solution, donc je pense que c'est mon meilleur pari. – Charlie

+0

Comment ajouter les éléments au menu d'origine après avoir fermé la liste déroulante? – Germstorm

Questions connexes