2011-02-24 2 views
0

J'ai quelques routines pour les commandes comme control-A, copier coller et tout fonctionne bien. Ensuite, j'ai ajouté 4 autres commandes routées pour déplacer l'objet vers le bas à gauche et à droite dans le canevas à l'aide des touches fléchées, elles fonctionnent parfois et parfois non. Au début, je pensais que c'était un problème de Focus sur le Canvas, mais je viens de découvrir que, en même temps, toutes les autres commandes routées comme control-A fonctionnent mais les touches fléchées ne le font pas. Je n'ai vraiment aucune idée de ce qui se passe ici, ce sont des commandes routées identiques avec des noms de variables différents, comment se fait-il que l'on travaille 100% du temps et que l'on ne travaille que 50% du temps?WPF Routed Command ne se déclenche parfois que

travail RoutedCommand:

_bindings.Add(new CommandBinding(DesignerCanvas.SelectAll, SelectAll_Executed)); 
SelectAll.InputGestures.Add(new KeyGesture(Key.A, ModifierKeys.Control)); 

private void SelectAll_Executed(object sender, ExecutedRoutedEventArgs e) 
{ 
    SelectionService.SelectAll(); 
} 

Dysfonctionnement RoutedCommand:

_bindings.Add(new CommandBinding(DesignerCanvas.MoveDown, MoveDown_Executed)); 
MoveDown.InputGestures.Add(new KeyGesture(Key.Down)); 

private void MoveDown_Executed(object sender, ExecutedRoutedEventArgs e) 
{ 
    e.Handled = true; 
    var selectedItems = from item in SelectionService.CurrentSelection.OfType<DesignerItem>() 
          select item; 

    if (selectedItems.Count() > 0) 
    { 
     for (int i = 0; i < selectedItems.Count(); i++) 
      selectedItems.ElementAt(i).Top += Option.OptionSingleton.Sensitivity; 
    } 
} 

Le dysfonctionnement RoutedCommand est tout simplement pas tire parfois, surtout après avoir ouvert une autre fenêtre et revenir à la toile, alors il arrête de tirer alors que les autres commandes routées ne sont pas affectées. Des idées sur ce qui cause ce comportement bizarre?

Répondre

1

Il se trouve que c'était une question de mise au point, je mis tout l'accent sur la toile chaque fois entre la souris, maintenant il est en quelque sorte fixé. Merci tout le monde pour répondre.

2

Vous pouvez sometiems utiliser des gestionnaires d'événements de classe très inclusive pour tracer la voie d'un événement:

EventManager.RegisterClassHandler(typeof(FrameworkElement), CommandManager.CanExecuteEvent, 
    new CanExecuteRoutedEventHandler((s, e) => Debug.WriteLine("CanExecute: " + s)), true); 
EventManager.RegisterClassHandler(typeof(FrameworkElement), CommandManager.ExecutedEvent, 
    new CanExecuteRoutedEventHandler((s, e) => Debug.WriteLine("Executed:" + s)), true); 
EventManager.RegisterClassHandler(typeof(FrameworkElement), CommandManager.ExecutedEvent, 
    new CanExecuteRoutedEventHandler((s, e) => Debug.WriteLine("KeyDown:" + s)), true); 

Dans votre cas, le KeyDown peut être traitée avant d'atteindre la commande de liaison ou l'événement CanExecute ne peut l'atteindre pour une autre raison.

Espérons que cela vous aidera à déboguer le problème

1

Cela peut être dû au fait que la clé que vous utilisez est la clé « vers le bas ». Je soupçonne que si vous utilisiez une clé différente, cela fonctionnerait.

Certaines commandes utilisent les touches fléchées et les touches pageup/pagedown. Par exemple, TextBox fait cela. Si votre toile est dans un ScrollViewer, ScrollViewer peut-être manger.

Il existe deux solutions de contournement pour cela:

  1. Ajouter une liaison au contrôle qui est en train de manger le geste clé.
  2. Poignée KeyPreview pour la toile (ou tout autre parent du contrôle qui est de manger la frappe) et exécuter la commande à partir de là.

La réponse à this question montre comment vous pouvez faire # 2 sans écrire de code spécifique dans le gestionnaire KeyPreview pour chaque commande.

Questions connexes