Как получить клавиатуру от дочерних элементов управления в WPF? - PullRequest
3 голосов
/ 30 сентября 2010

У меня есть несколько входных привязок в окне:

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

Команды определены в моей модели представления как 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);

Это отлично работает.Однако всякий раз, когда я выбираю элемент в списке (который является дочерним элементом окна), привязки клавиш перестают работать.Как я могу заставить родителя захватывать сочетания клавиш независимо от того, какой ребенок имеет фокус (если есть).(разве события не должны всплыть?)

Я знаю, что есть событие PreviewKeyDown, которое делает именно это, но это сделает мои ICommand бесполезными, поэтому я бы предпочел декларативноеРешение, если это возможно.

Заранее спасибо.

1 Ответ

0 голосов
/ 30 сентября 2010

Насколько я знаю, не существует декларативного способа заставить обработанные события продолжать пузыриться.

Как вы сказали, самый простой способ - обработать Preview события.

В качестве альтернативы вы можете переопределить ваш метод ListBox класса OnKeyDown следующим образом:

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