У меня есть несколько InputBindings в окне:Как захватить клавиатуру из дочерних элементов управления в WPF?
<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);
Это прекрасно работает. Однако, когда я выбираю элемент в списке (который является дочерним элементом окна), KeyBindings перестают работать. Как я могу заставить родителя захватить привязки клавиш, независимо от того, какой из них имеет фокус (если есть). (не должны ли события пузыриться в любом случае?)
Я знаю, что есть событие PreviewKeyDown, которое делает именно это, но это сделает мой ICommand
s бесполезным, поэтому я бы предпочел, если возможно, декларативное решение.
Заранее спасибо.
Спасибо за ваш ответ, я добавил еще несколько деталей. Я подозреваю, что у меня есть некоторые проблемы с моей реализацией ICommand, но я не знаю, что. –
Я добавил этот обработчик событий, и действительно интересно, что он не срабатывает для трех связанных клавиш (пробел, левый и R). Я очень смущен. –
Он работал для меня в образце проекта, где я использовал привязку к существующей команде ApplicationCommands.open. Три клавиши ответили правильно. Я могу добавить свой образец, если вы хотите, но в нем почти ничего нет. – Mart