2010-09-29 5 views
3

У меня есть несколько 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 бесполезным, поэтому я бы предпочел, если возможно, декларативное решение.

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

ответ

0

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

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

В качестве альтернативы, вы можете переопределить OnKeyDown метод ListBox класса, как это:

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

Спасибо за ваш ответ, я добавил еще несколько деталей. Я подозреваю, что у меня есть некоторые проблемы с моей реализацией ICommand, но я не знаю, что. –

+0

Я добавил этот обработчик событий, и действительно интересно, что он не срабатывает для трех связанных клавиш (пробел, левый и R). Я очень смущен. –

+0

Он работал для меня в образце проекта, где я использовал привязку к существующей команде ApplicationCommands.open. Три клавиши ответили правильно. Я могу добавить свой образец, если вы хотите, но в нем почти ничего нет. – Mart

Смежные вопросы