您需要处理PreviewKeyDown
表单的事件。然后检查是否要处理该事件,如果要处理,请将Handled
事件的属性设置为true
之后。
这可能看起来像这样:
public MainWindow()
{
InitializeComponent();
PreviewKeyDown += new KeyEventHandler(MainWindow_PreviewKeyDown);
}
void MainWindow_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Space)
{
Log("Intercepted space in preview");
e.Handled = true;
}
}
为什么需要设置Handled
为true
?WPF 中的事件是在几个 UI 元素上触发的,其方式取决于它的“路由策略”。当您的事件处理程序设置Handled
为true
时,该事件的可见性将仅限于其他 UI 元素。很快,它不会在其他 UI 元素中触发。要了解有关上述解决方案的详细信息,请阅读下面的其余答案。
如果要在 WPF 中正确使用事件,则需要了解一些事项。事件附加到 UI 元素(文本框、按钮等),并且事件处理程序可以连接到这些 UI 元素。此外,UI 元素以树状结构组织。每个元素都有它的父元素,直到根 UI 元素。如前所述,事件在多个元素上触发,具体取决于它们的“路由策略”。这里的多个元素是指事件所针对的元素及其父元素,直到根元素。事件路由策略可以如下:
- 冒泡:首先为事件目标元素触发事件。然后,它被触发它的父元素,然后是它的父元素的父元素,依此类推,直到根元素(通常是窗口)
- Tunneling:首先为根 UI 元素触发事件,然后沿着 UI 元素树向下,沿着到达目标元素的路线。
- Direct:仅针对目标元素触发事件。
这与Handled
财产有什么关系?当事件使用冒泡或隧道路由策略时,Handled
属性用于停止事件向下或向上传播 UI 元素树。
现在,当您将其标记为 时,为什么KeyDown
事件没有停止传播Handled
?因为KeyDown
事件使用冒泡策略。这意味着文本框在到达您设置Handled
为true
.
出于这个原因,您应该使用PreviewKeyDown
which uses tunneling 策略。您的窗口处理程序检查事件,将其标记为Handled
需要。如果它被标记为Handled
它不会被触发向下 UI 树到事件目标。
您可以将其视为 .NET 框架中的约定。PreviewX
是使用隧道策略的事件,并且是X
使用bubbling
策略的事件的对应物。
要了解有关路由事件的更多信息,请访问此 MSDN 页面。您会发现 MSDN 是关于 WPF 的一个很好的信息来源。