Quelle est la bonne façon de choisir dynamiquement les éléments de menu pour un menu contextuel dans WinForms?

StackOverflow https://stackoverflow.com/questions/103514

  •  01-07-2019
  •  | 
  •  

Question

J'essaie de créer un menu contextuel pour un contrôle qui est "lié" à un élément du menu principal. Deux éléments de menu fixes sont toujours présents et un nombre arbitraire d’éléments de menu supplémentaires qui pourraient devoir figurer dans le menu.

J'ai essayé de résoudre le problème en conservant une référence au niveau de la classe pour les éléments de menu fixes et une liste des éléments de menu dynamiques. Je gère les événements Ouverture des deux menus en effaçant la liste d'éléments actuelle, puis en ajoutant les éléments appropriés au menu. Cela fonctionne bien pour le menu principal, mais le menu contextuel se comporte étrangement.

Le problème majeur semble être que lorsque Ouverture est activé, le menu a déjà décidé des éléments à afficher. Ce formulaire montre:

using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public class DemoForm : Form
    {
        private List _items;

        public DemoForm()
        {
            var contextMenu = new ContextMenuStrip();
            contextMenu.Opening += contextMenu_Opening;

            _items = new List();
            _items.Add(new ToolStripMenuItem("item 1"));
            _items.Add(new ToolStripMenuItem("item 2"));


            this.ContextMenuStrip = contextMenu;
        }

        void contextMenu_Opening(object sender, CancelEventArgs e)
        {
            var menu = sender as ContextMenuStrip;

            if (menu != null)
            {
                foreach (var item in _items)
                {
                    menu.Items.Add(item);
                }
            }
        }
    }
}

Lorsque vous cliquez avec le bouton droit sur le formulaire pour la première fois, rien ne s'affiche. La deuxième fois, le menu est affiché comme prévu. Y at-il un autre événement qui est soulevé où je pourrais mettre à jour les éléments? Est-ce une mauvaise pratique de choisir dynamiquement les éléments de menu?

( Remarque: ceci est un exemple que j'ai commencé à faire pour quelqu'un qui voulait une telle fonctionnalité et j'étais curieux de savoir à quel point c'est difficile. Je ne peux donc pas donner de détails sur la raison pour laquelle cela pourrait être fait. Cette personne veut "lier" un élément du menu principal au menu contextuel, et comme les éléments de menu ne peuvent être que les enfants d'un seul menu, cela semblait un moyen raisonnable de le faire. Toute suggestion alternative d'approche est la bienvenue. )

Était-ce utile?

La solution

Vous pouvez utiliser les éléments lors de l'événement MouseDown du contrôle. Vérifiez qu’il s’agit bien du bouton droit de la souris.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top