当我尝试使用文本框时,我的应用程序中的KeyBindings正在窃取按键消息。例如:
<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>
使用的命令是具有ICommand接口的DelegateCommands。
问题是Keys P,R,I,U无法传播到任何文本框。
有没有办法继续路由?
答案 0 :(得分: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);
}
}