我正在尝试将四个箭头键绑定到我的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。
答案 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/