2008-12-19 4 views
1

Je crée une application WPF et j'ai une icône de barre d'état système avec un menu contextuel. Pour les éléments de menu, je veux utiliser les commandes WPF mais quand je les assigne, elles sont toujours grisées même si les (mêmes) commandes sont activées à d'autres endroits.Menu contextuel Systray - pourquoi mes commandes ne sont-elles pas activées?

MenuItem menuItem = new MenuItem(); 
menuItem.Header = "Exit"; 
menuItem.Command = CustomCommands.ExitApplication; 
Systray.AddMenuItem(menuItem); 

Il fonctionne très bien quand j'attribue les événements de clic et j'ai essayé de créer une méthode CanExecute pour la commande qui met toujours à CanExecute vrai, mais cela ne suffit pas non plus. Quelqu'un a-t-il une idée de la raison pour laquelle les éléments de menu sont désactivés?


Mise à jour: Comme suggéré, j'ai ajouté une commande de liaison au menu contextuel. Cela a eu pour effet que cela fonctionne, mais seulement après avoir cliqué sur le menu, c'est-à-dire que les options de menu sont d'abord grisées, mais une fois que vous avez cliqué quelque part dans le menu, les options sont activées.

Pour résoudre ce problème, j'ai appelé ce qui suit, après avoir ajouté les éléments de menu dans le menu contextuel:

CommandManager.InvalidateRequerySuggested(); 

Répondre

3

Du haut de ma tête je suppose que vous devez ajouter un CommandBinding au menu ou systray pour que votre commande soit traitée. Bien que je pense que si c'était le cas, il serait activé par défaut.

2

Oui, j'ai vu cela se produire. Parfois, vous devez indiquer au système WPF CommandManager de réexécuter les méthodes CanExecute. Essayez d'appeler ceci une fois que le ContextMenu est chargé: CommandManager.InvalidateQuerySuggested();

+1

Thx, cela a fait l'affaire. Le nom de la méthode est actuellement InvalidateRequerySuggested(). –

0

J'ai eu un problème similaire. Je sens que ma solution est un peu un hack, mais je ne pourrais vraiment pas contourner ce problème. J'utilise une implémentation DelegateCommand personnalisée, et les boutons et les éléments de menu ebabling/disable fonctionnent à l'exception des éléments des menus contextuels. Donc, ce que j'ai fait était de gérer l'événement ContextMenuOpening, puis de stocker la variable Items dans une variable temporaire, d'appeler la méthode Clear dans le menu contextuel et d'ajouter à nouveau les éléments juste après. Fonctionne comme un charme, mais comme je l'ai dit, se sent "hacky". Il va quelque chose comme ceci:

private void ContextMenu_ContextMenuOpening (object sender, System.ComponentModel.CancelEventArgs e) 
    { 
     // HACK: For some reason items need to be removed and added back so that the command enablement requery works. 
     var menu = sender as ContextMenu; 
     if (menu == null) return; 

     var menuItems = menu.Items.ToArray(); 
     menu.Items.Clear(); 
     foreach (var menuItem in menuItems) 
      menu.Items.Add(menuItem); 
    } 
Questions connexes