如何从WPF中的子控件中获取键盘?

时间:2010-09-29 23:34:44

标签: wpf xaml keyboard command

我在Window中有一些输入法:

<Window.InputBindings>
    <KeyBinding Key="Space" Command="{Binding Path=StepNext}" />
    <KeyBinding Key="R" Command="{Binding Path=ResetSong}" />
    <KeyBinding Key="Left" Command="{Binding Path=StepPrevious}" />             
</Window.InputBindings>

命令在我的viewmodel中定义为RelayCommands:

public class RelayCommand : ICommand
{
    private Action<object> _exec;
    private Func<object, bool> _canExec;

    public RelayCommand(Action<object> exec, Func<object, bool> canExec)
    {
        _exec = exec;
        _canExec = canExec;
    }

    public void Execute(object parameter)
    {
        _exec(parameter);
    }

    public bool CanExecute(object parameter)
    {
        return _canExec(parameter);
    }

    public event EventHandler CanExecuteChanged;
}

在ViewModel的构造函数中:

StepNext = new RelayCommand(DoStepNext, CanStepNext);

这很好用。但是,每当我在列表框中选择一个项目(它是Window的子项)时,KeyBindings就会停止工作。如何让父项捕获键绑定,而不管哪个子项具有焦点(如果有)。 (不管事件不应该冒泡吗?)

我知道有一个PreviewKeyDown事件可以做到这一点,但这会使我的ICommand无用,所以如果可能的话我更喜欢声明性的解决方案。

提前致谢。

1 个答案:

答案 0 :(得分:0)

据我所知,没有声明性方法可以让处理事件继续冒泡。

正如您所说,最简单的方法是处理Preview事件。

作为替代方法,您可以覆盖ListBox类OnKeyDown方法,如下所示:

protected override void OnKeyDown(KeyEventArgs e)
{
    base.OnKeyDown(e);
    if (e.Key == Key.Space || e.Key == Key.Left)
        e.Handled = false;
}