【问题标题】:Why does the KeyDown event bubble up from a TextBox?为什么 KeyDown 事件会从 TextBox 中冒出?
【发布时间】:2012-08-28 05:45:37
【问题描述】:

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

【问题讨论】:

  • 你是如何确认它冒泡的?
  • 我的窗口的 KeyDown 事件触发

标签: wpf keyboard


【解决方案1】:

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

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

然而,如果您尝试将事件PreviewKeyDown 挂接到您的文本框中,您将看到 - Window 的 PreviewKeyDownEvent 首先被调用,然后是您的文本框。背后的原因是,它是tunelling event。路由策略参考这个链接-Routing Strategies

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

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)
    {
    }
}

【讨论】:

  • 不过处理过肯定不应该冒泡吧?
  • 可以,下面处理就不会冒泡了。
  • 为什么TextBox不自动处理事件?
  • 这是期望的行为,因为在某些情况下,我们希望在父控件上处理相同的事件以进行某些处理。这就是为什么如果您不想在父窗口中处理冒泡,微软会在您手中阻止冒泡。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 1970-01-01
  • 2014-09-12
  • 2023-03-23
  • 2012-09-04
相关资源
最近更新 更多