2009-05-26 6 views
4

Un exemple assez simple et direct.CommandBinding in Window n'intercepte pas l'exécution de la commande depuis ContextMenu

J'ai une fenêtre. Il a CommandBindings défini pour attraper une exécution RoutedUICommand.

<Window 
    ... 
    > 
    <Window.CommandBinding> 
     <CommandBinding 
      Command="{x:Static local:Commands.Command1}" 
      Executed="OnCommand1Executed" 
      CanExecute="OnCanCommand1Execute" 
      /> 
    </Window.CommandBinding> 
</Window> 

Un UserControl est hébergé dans la fenêtre, à l'intérieur de laquelle un ContextMenu est déclaré. Un élément ContextMenu a la propriété Command assignée à la même RoutedUICommand.

<ContextMenu> 
    <MenuItem Command="{x:Static local:Commands.Command1}" /> 
</ContextMenu> 

Mais l'élément de menu reste inactif (== désactivé). D'une manière ou d'une autre, l'exécution des commandes ne va pas jusqu'à la fenêtre. Peut-être que c'est parce que ContextMenu est à l'intérieur d'un popup?

Tout fonctionne correctement si j'ajoute CommandBinding nécessaire dans la collection ContextMenu.CommandBindings. Mais c'est une option terrible de ne pas avoir de place pour un CommandBinding "global".

Comment puis-je résoudre le problème de la meilleure façon? UPD: Il s'avère que ce n'est pas si grave que ça. Les commandes ne sont pas liées uniquement à la première ouverture utilisateur ouvre le menu. Si c'est fermé et rouvert tout va bien. Pourtant, il semble ne pas être souhaitable et un comportement assez étrange.

Répondre

4

Est-ce que cela se produit toujours si vous ajoutez Focus(); juste après InitializeComponent(); dans le constructeur de windows? Cela ressemble à WPF a un problème à trouver l'arborescence visuelle dans le menu contextuel. Définir le focus sur la fenêtre principale pourrait le réparer. Comment nous pouvons gérer ce problème dans un contrôle utilisateur?

+0

Pour donner du crédit lorsque le crédit est dû, je pense que était l'endroit où j'ai d'abord vu cette solution de contournement http://cebla5.spaces.live.com/blog/cns!1B8262ED00250003!206.entry?wa=wsignin1.0&sa=834175698 –

+0

c'est tellement bizarre mais ça marche, merci: – arconaut

+0

Voir http://stackoverflow.com/a/6070771 pour une solution de rechange. À mon humble avis, c'est une meilleure approche - XAML seulement et ne dépend pas de l'effet secondaire de focus - mais il a l'inconvénient de provoquer un faux message d'erreur "Référence d'objet non définie à une instance d'un objet" dans le XAML éditeur (juste dans l'éditeur ... le code compile encore et fonctionne bien). Si je pouvais trouver un moyen de corriger cette erreur, je dirais que l'alternative était 100% préférable. –

1

Il semble que l'accent ne fonctionne pas dans ce contexte

Mise à jour: J'ai trouvé la solution ici How to set CommandTarget for MenuItem inside a ContextMenu?

semble que c'est lié à CommandTarget

<MenuItem x:Name="mnuProperties" Header="_Properties" 
      Command="{x:Static localcommands:TaskCommands.ViewTaskProperties}" 
      CommandTarget="{Binding PlacementTarget, 
      RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ContextMenu}}}"/> 
Questions connexes