1
votes

Les raccourcis clavier ne se déclenchent pas

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.


5 commentaires

Cette classe Viewmodel ne se compilera pas ... Aussi généralement une VM implémente le INotifyPropertyChanged , est-ce un travail en cours? Pouvez-vous afficher tout le code xaml?


Quel est le Contenu du Control Control ? Peut-être qu'il gère et «avale» les événements clés? Ce n'est pas une liaison puisque le And 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.


3 Réponses :


-1
votes
            PanRightCmd= new RelayCommand(o => PanRightCmdExecute());

1 commentaires

Pensez à ajouter une explication de votre code, cela aiderait beaucoup si le post de c-sharpcorner venait à mourir.



2
votes

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.


0 commentaires

0
votes

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>


0 commentaires