3

如果我在 TextBox 中键入一个字母,并且它的内容会根据我的按键而改变,为什么 KeyDown 事件会继续冒泡?我原以为这会在这个阶段得到“处理”。

4

1 回答 1

4

由于KeyDownevent 是 a bubbling event,这就是为什么它在您的案例 Window 中冒泡到其父级的原因。如果您不希望它冒泡到您的窗口,您需要像这样在您的 textBox 处理程序本身中将其标记为已处理 -

private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
  e.Handled = true;
}

然而,如果您尝试在您的文本框中挂钩事件PreviewKeyDown,您会看到 - Window 的 PreviewKeyDownEvent 首先被调用,然后是您的文本框。背后的原因是,它是一个tunelling event. 有关路由策略,请参阅此链接 -路由策略

编辑 Morevoer,如果你想检查KeyDown事件是否来自textBox,你可以检查OriginalSource你的eventArgs -

private void Window_KeyDown(object sender, KeyEventArgs e)
{
    // Check to make sure event comes from window and not from textbox.
    if(e.OriginalSource is Window)
    {
    }
}
于 2012-09-03T14:02:25.483 回答