Как продолжить маршрутизацию с DelegateCommand в WPF

Привязки клавиш в моем приложении скрывают сообщения клавиш, когда я пытаюсь использовать текстовое поле. Так, например:

<ribbon:RibbonWindow.InputBindings>
    <KeyBinding Command="{Binding Review.ReviewReviewedCommand}" CommandParameter="Key" Key="Space" />
    <KeyBinding Command="{Binding Review.ReviewLabelPrivilegedCommand}" CommandParameter="Key" Key="P" />
    <KeyBinding Command="{Binding Review.ReviewLabelRelevantCommand}" CommandParameter="Key" Key="R" />
    <KeyBinding Command="{Binding Review.ReviewLabelIrrelevantCommand}" CommandParameter="Key" Key="I" />
    <KeyBinding Command="{Binding Review.ReviewUnassignDocTypeCommand}" CommandParameter="Key" Key="U" />
</ribbon:RibbonWindow.InputBindings>

Используемые команды являются DelegateCommands с интерфейсом ICommand.

Проблема в том, что ключи P,R,I,U не могут быть переданы ни в какое текстовое поле.

Есть ли способ продолжить маршрутизацию?

0 ответов

Пока вы используете KeyBindingэто не будет работать без серьезных хаков. Я реализовал следующее решение:

  1. Использовать KeyDown событие для захвата этих нажатых клавиш (вместо KeyBindings). Это будет в вашем коде программной части, и оттуда вам нужно будет включить нажатую клавишу, чтобы вызвать требуемыйDataContext's команда (ReviewReviewedCommand, ReviewLabelPrivilegedCommand, так далее).
  2. Теперь у вас другая проблема. ВTextBoxполучает ввод, но ваши команды, связанные с клавишами, также запускаются. В коде позади проверьте типkeyEventArgs.InputSource и игнорируйте нажатие клавиши, если это TextBox.

Должно получиться так:

private void OnKeyDown(object sender, KeyEventArgs e)
{
    ICommand command = null;

    switch (e.Key)
    {
        case Key.Space:
            command = ((YourDataContextType)DataContext).ReviewReviewedCommand;
            break;
        case Key.P:
            command = ((YourDataContextType)DataContext).ReviewLabelPrivilegedCommand;
            break;
    }

    bool isSourceATextBox = e.InputSource.GetType() == typeof(TextBox);
    if (command != null && !isSourceATextBox)
    {
        command.Execute(parameter:null);
    }
}
Другие вопросы по тегам