Как продолжить маршрутизацию с 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
это не будет работать без серьезных хаков. Я реализовал следующее решение:
- Использовать
KeyDown
событие для захвата этих нажатых клавиш (вместоKeyBindings
). Это будет в вашем коде программной части, и оттуда вам нужно будет включить нажатую клавишу, чтобы вызвать требуемыйDataContext's
команда (ReviewReviewedCommand
,ReviewLabelPrivilegedCommand
, так далее). - Теперь у вас другая проблема. В
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);
}
}