【发布时间】:2012-08-28 05:45:37
【问题描述】:
如果我在 TextBox 中键入一个字母,并且它的内容会根据我的按键而改变,为什么 KeyDown 事件会继续冒泡?我原以为这会在这个阶段得到“处理”。
【问题讨论】:
-
你是如何确认它冒泡的?
-
我的窗口的 KeyDown 事件触发
如果我在 TextBox 中键入一个字母,并且它的内容会根据我的按键而改变,为什么 KeyDown 事件会继续冒泡?我原以为这会在这个阶段得到“处理”。
【问题讨论】:
由于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)
{
}
}
【讨论】: