箭头键绑定未触发

时间:2019-04-16 14:21:24

标签: c# wpf xaml mvvm

我正在尝试将四个箭头键绑定到我的ViewModel中的命令,但是它们不起作用。我在ContentControl中的Window中有一个InputBindings,像这样:

<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>

在我的ViewModel中:

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

现在,按Escape键可以正常工作,但四个箭头键不能正常工作。为什么是这样?它们的设置完全相同。我以为可能与DataContext有关,所以我将KeyBinding放在窗口s InputBindings`中,但这是同样的问题。

编辑:我已经测试了键盘上的每个键。除四个箭头键外,每个键均可以正常触发。我检查了Content中的ContentControl是否吞下了事件,但事实并非如此。实际上,作为Control的{​​{1}}拥有自己的keydown事件,使用箭头键也不会调用该事件,也不会调用Previewkeydown。

3 个答案:

答案 0 :(得分:1)

我复制了您的代码,它似乎工作正常。

我认为在您的情况下此方法不起作用的唯一原因(尤其是Esc有效,但其他键无效)是因为您在ContentControl内部使用的任何内容也包含方向键的输入绑定。

在这种情况下,内容中的绑定将覆盖您为ContentControl本身设置的绑定。

答案 1 :(得分:0)

箭头键由 KeyboardNavigation 默认处理。 您应该禁用 KeyboardNavigation ,并确保控件可聚焦。

  <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>

答案 2 :(得分:-1)

 public ICommand PanRightCmd 
    {
        get { return (ICommand)GetValue(SearchBarEnterCmdProperty); }
        set { SetValue(SearchBarEnterCmdProperty, value); }
    }

...

            PanRightCmd= new RelayCommand(o => PanRightCmdExecute());

https://www.c-sharpcorner.com/UploadFile/20c06b/icommand-and-relaycommand-in-wpf/