我的程序相当大,并且使用WPF,我想有一个使用'R'的全局快捷键,没有修饰符。
有许多控件,如TextBox, ListBox, ComboBox等,都在控件本身使用字母,这是好的-这对我来说是正确的。
但是- 我想保持KeyDown事件从冒泡到主窗口,在那里它会触发快捷方式任何时候用户在文本框中输入字母'R',例如。
理想情况下,我希望能够做到这一点,而不必指定(并执行if-then逻辑)每个实例/类型的控件,可能会接受正常的字母键(不只是TextBox控件,尽管它们是最严重的违规者)。
只需检查OriginalSource
在您的KeyDown
事件处理程序中的内容:
private void Window_KeyDown(object sender, KeyEventArgs e) {
if(e.OriginalSource is TextBox || e.OriginalSource is DateTimePicker) //etc
{
e.Handled = true;
return;
}
}
或者如果你正在使用InputBindings,尝试在你的窗口上的KeyDown
或PreviewKeyDown
事件中设置e.Handled = true
,而不是单独的控件。无论如何,我认为OriginalSource
是你答案的关键。(我发誓这不是双关语)。
当你处理KeyDown
事件时,它应该传递给你一个KeyEventArgs
。从那里,你可以设置Handled
为true,这样它就不会冒泡了。
private void TextBoxEx_KeyAction(object sender, KeyEventArgs e)
{
e.Handled = true;
}