Question

J'ai une toile dans une vue à défilement. J'ai attaché un gestionnaire d'événements keydown au scrollview. Pour la plupart des clés, le gestionnaire est appelé.

Cependant, pour les touches de direction, le gestionnaire n'est pas appelé. Au lieu de cela, la vue de défilement est défilée dans la direction appropriée.

J'ai également attaché un gestionnaire keyup à la vue de défilement et la keyup est appelée pour les touches de direction.

Y a-t-il un moyen d'obtenir l'événement en raison des touches fléchées ici?

Était-ce utile?

La solution 2

J'ai trouvé ce bidouillage idiot pour le faire fonctionner. Définir la vue de défilement pour qu’elle ne soit pas une tabulation l’empêche de manger les événements clés. J'ai donc corrigé cela en laissant un champ de texte invisible se concentrer.

scrollView.IsTabStop = false;

invisibleTextBox.Foreground = new SolidColorBrush(Colors.Transparent);
invisibleTextBox.Background = new SolidColorBrush(Colors.Transparent);
Canvas.SetZIndex(invisibleTextBox, -1000);
invisibleTextBox.KeyDown += new KeyEventHandler(HandleKeyDown);
invisibleTextBox.KeyUp += new KeyEventHandler(HandleKeyUp);

Modifier: je devais également déplacer la zone de texte du canevas car, malgré son invisible, son contour était toujours visible.

2nd Edit: j'ai utilisé une zone de texte car c'était la première chose que je trouvais capable de capturer les événements KeyDown. Cependant, un UserControl peut. Il serait donc probablement préférable d’utiliser un UserControl au lieu d’une zone de texte invisible. Vous pouvez appeler Focus () sur UserControl si nécessaire.

Autres conseils

Utilisez simplement l'événement KeyUp. Fonctionne comme un charme.

C’est une réponse possible - je n’ai pas eu la chance de le tester. J'ai eu des problèmes similaires dans le passé cependant, lorsqu'un contrôle consomme les événements avant que vous puissiez les obtenir. Vous pouvez peut-être essayer quelques choses:

  1. Utilisez l'événement PreviewKeyDown, je pense que c'est ainsi qu'il s'appelle. Il peut vous laisser accéder à l'événement avant qu'il ne soit consommé par le contrôle.
  2. Essayez la suggestion de mblandfo, bien que si vous faites cela, vous devez probablement envelopper le tout dans un contrôle utilisateur pour masquer ce que vous faites du reste de votre code.
  3. Ajoutez un gestionnaire de clés à l'objet Canvas, vous pourrez peut-être capturer l'événement là-bas et "bulle". à travers votre propre événement.

À l'exception de 1) toutes ces actions sont considérées comme des bidouilles, vraiment, mais bonne chance, j'espère que l'une d'entre elles fonctionnera pour vous!

" Utilisez l'événement PreviewKeyDown, je pense que c'est ainsi qu'il s'appelle. Il peut vous laisser accéder à l'événement avant qu'il ne soit consommé par le contrôle. "

Cela fonctionne. Il suffit de définir les arguments d'événement "Handled = true". et le ScrollViewer (ou ListBox) ne saisiront pas l'événement après l'avoir géré. Je n'avais cependant pas besoin d'utiliser la propriété IsTabStop pour le ListBox; cela et il n'a pas semblé faire quoi que ce soit de toute façon.

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