Comment désactiver les changements de focus avec les touches fléchées

J’ai une fenêtre WPF avec quelques contrôles (boutons, boîtes de groupe, etc.) et un grand Viewport3D dans une Border .

La fenêtre affiche une scène en 3D et je veux que les touches fléchées déplacent sa caméra. Le problème: les touches fléchées changent toujours le focus sur un autre UIElement .

Comment puis-je désactiver les modifications de la mise au point à l’aide des touches de direction et leur demander de changer la position de la caméra?

Il est toujours difficile de répondre sans avoir un code à tester, car sans lui, nous devinions vraiment. Quoi qu’il en soit, je ne peux pas commenter votre situation particulière, mais en général, si nous voulons empêcher l’ e.Handled action prédéfinie dans un événement, nous gérons généralement cet événement et définissons la propriété e.Handled sur true .

Étant donné que vous souhaitez déjà gérer l’événement KeyDown pour détecter l’utilisation des touches fléchées, vous pouvez définir la propriété e.Handled sur true en même temps. Cependant, vous PreviewKeyDown plutôt gérer l’événement PreviewKeyDown , car il se produit avant l’événement KeyDown et a donc plus de chances de produire l’effet souhaité. Essayez quelque chose comme ça:

 private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Left || e.Key == Key.Right) { // Move your camera here e.Handled = true; } } 

Si nous voulons pouvoir passer d’un contrôle à l’autre, mais pas de la touche de direction au travers du même ensemble de contrôles une fois qu’ils sont en mode de navigation au clavier, nous devrions pouvoir définir KeyboardNavigation.DirectionalNavigation="None" pour le conteneur (dans ce cas, la fenêtre ).

Cependant, il semble qu’un bogue empêche la solution de fonctionner.

La solution de contournement de la définition de KeyboardNavigation.DirectionalNavigation="Once" fonctionne cependant.

  • Le seul inconvénient que j’ai remarqué jusqu’à présent est que lorsque vous appuyez sur une touche fléchée, FocusVisualStyle est rechargé pour l’élément actuellement sélectionné.

Tu peux essayer

 KeyboardNavigation.TabNavigation = "Local" 

pour ne pas déplacer votre attention en dehors de Viewport3D .