2010-06-20 7 views
5

J'ai une application WPF où je l'ai défini des commandes personnalisées qui utilisent les gestes clés Ctrl + et Ctrl +. Ma fenêtre a une TextBox et un ScrollViewer et quand le TextBox a le focus Ctrl + et Ctrl + déplacer le curseur au début du mot suivant ou précédent, ce qui est bien.Marque ScrollViewer pas prendre le contrôle gauche et droit de contrôle dans WPF

Mais le ScrollViewer rend le mouvement de défilement horizontal comme si je l'avais pressé juste ou . Quelle est la meilleure façon de permettre à la Ctrl + et Ctrl + événements à bouillonner de mon ScrollViewer à la fenêtre où est défini les Command?

Répondre

4

J'ai eu ce travail en faisant le

suivant
public class MyScrollViewer : ScrollViewer 
{ 
    protected override void OnKeyDown(KeyEventArgs e) 
    { 
     if (e.KeyboardDevice.Modifiers == ModifierKeys.Control) 
     { 
      if (e.Key == Key.Left || e.Key == Key.Right) 
       return; 
     } 
     base.OnKeyDown(e); 
    } 
} 

Je pense que l'astuce est de comprendre que l'événement commence au sommet et travaille son chemin vers le bas. Ensuite, en remontant, chaque "couche" vérifie la valeur booléenne Handled et si elle n'est pas définie sur true, elle déterminera si elle fera quelque chose et la configurera si c'est le cas. J'avais besoin de court-circuiter ce comportement pour mes raccourcis afin que Handled soit toujours faux quand il est remonté au niveau de la fenêtre.

+0

Parfait. Merci! +1 –

3

Vous devez remplacer l » événement PreviewKeyDownScrollViewer et mettre e.Handled = true et transmettre l'événement parent en utilisant quelque chose comme (this.Parent as FrameworkElement).RaiseEvent(e); si les touches pressées ont été l'une des combinaison de touches que vous avez attribué à vos commandes.

+0

C'est la bonne réponse pour la visionneuse de défilement (dans WPF). L'événement OnKeyDown ne se déclenche pas sur les touches fléchées, mais cela est le cas. Merci! –