J'essaie de faire en sorte que les quatre touches fléchées soient liées à une commande dans mon ViewModel
, mais elles ne fonctionnent pas. J'ai un ContentControl
dans une Fenêtre
avec des InputBindings
comme ceci:
public RelayCommand EndCmd { get; set; } public RelayCommand PanUpCmd { get; set; } public RelayCommand PanDownCmd { get; set; } public RelayCommand PanLeftCmd { get; set; } public RelayCommand PanRightCmd { get; set; } public MainViewModel() { EndCmd = new RelayCommand(End); PanUpCmd = new RelayCommand(PanUp); PanDownCmd = new RelayCommand(PanDown); PanLeftCmd = new RelayCommand(PanLeft); PanRightCmd = new RelayCommand(PanRight); } //functions that the commands call here
Dans mon ViewModel
:
<ContentControl.InputBindings> <KeyBinding Command="{Binding EndCmd}" Key="Esc" /> <KeyBinding Command="{Binding PanUpCmd}" Key="Up" /> <KeyBinding Command="{Binding PanDownCmd}" Key="Down" /> <KeyBinding Command="{Binding PanLeftCmd}" Key="Left" /> <KeyBinding Command="{Binding PanRightCmd}" Key="Right" /> </ContentControl.InputBindings>
Maintenant, la touche Échap fonctionne bien, mais pas les quatre touches fléchées. Pourquoi est-ce? Ils sont mis en place exactement de la même manière. Je pensais que c'était peut-être quelque chose à voir avec le DataContext
alors j'ai mis les KeyBinding
s dans les s
InputBindings de la fenêtre, mais c'était le même problème .
Edit: J'ai testé chaque touche de mon clavier. Chaque touche se déclenche correctement à l'exception des quatre touches fléchées. J'ai vérifié si le Content
du ContentControl
avalait les événements, et ce n'était pas le cas. En fait, le Control
qui est le Content
a son propre événement keydown, qui n'est jamais appelé non plus, ni le previewkeydown, avec les touches fléchées.
3 Réponses :
PanRightCmd= new RelayCommand(o => PanRightCmdExecute());
Pensez à ajouter une explication de votre code, cela aiderait beaucoup si le post de c-sharpcorner venait à mourir.
J'ai copié votre code et cela semble fonctionner correctement.
La seule raison pour laquelle je peux penser que cela ne fonctionne pas dans votre cas (surtout si Esc
fonctionne, mais pas les autres clés) est que quel que soit le contenu que vous utilisez à l'intérieur du ContentControl
contient également des liaisons d'entrée pour les touches de direction.
Dans ce cas, les liaisons dans le contenu remplaceraient les liaisons que vous avez définies pour le ContentControl
lui-même.
Les touches fléchées sont gérées par KeyboardNavigation par défaut. Vous devez désactiver KeyboardNavigation et vous assurer que le contrôle peut être mis au point.
<Grid Background="{Binding Background}" KeyboardNavigation.ControlTabNavigation="None" Focusable="True"> <Grid.InputBindings> <KeyBinding Key="Left" Command="local:OpsCommands.MoveLeft" /> <KeyBinding Key="Up" Command="local:OpsCommands.MoveUp" /> <KeyBinding Key="Right" Command="local:OpsCommands.MoveRight" /> <KeyBinding Key="Down" Command="local:OpsCommands.MoveDown" /> </Grid.InputBindings> </Grid>
Cette classe
Viewmodel
ne se compilera pas ... Aussi généralement uneVM
implémente leINotifyPropertyChanged
, est-ce un travail en cours? Pouvez-vous afficher tout le code xaml?Quel est le
Contenu
duControl Control
? Peut-être qu'il gère et «avale» les événements clés? Ce n'est pas une liaison puisque leAnd Cmd
fonctionne très bien.Si le contrôle de contenu n'a aucun élément d'interface utilisateur, ces commandes ne se déclenchent pas, j'ai pu répliquer le problème de mon côté. Une astuce que j'ai faite a été de définir le
Focusable = True
et lorsque l'élément d'interface utilisateur avait le focus, cela fonctionne très bien.Manquait un crochet, mais oui, le ViewModel se compile et il implémente la propriété modifiée. Je n'ai montré (ce que je pensais) que les parties pertinentes. Le contenu est un contrôle de carte tiers. Je vais tester s'il avale les événements clés, mais il est étrange que la touche d'échappement fonctionne correctement.
@ Çöđěxěŕ vous aviez raison. J'avais une zone de texte dans la fenêtre qui était toujours au centre. Une fois tabulés dans le contentcontrol, les événements ont commencé à fonctionner.