【发布时间】:2015-12-22 06:11:19
【问题描述】:
假设我在可视化树的某处有我的用户控件。父母和孩子是我无法修改的第 3 方控件。我想过滤我的控件中的键盘事件,以便 children 控件不会接收到某些键盘事件,但父控件会接收。
我将尝试用一些图表来解释我想要实现的目标。如果控件不处理键盘事件,则所有事件都会通过可视化树反弹:
但是,f.e.当用户按下 A,
我可以通过在MyControl.PreviewKeyDown 中设置e.Handled = true 来实现(1)。问题是在这种情况下TextInput 事件不会生成:
有没有办法实现第二张图片中的行为?
添加: 我要解决的问题是第 3 方控件(子 2)窃取了 OnPreviewKeyDown 中的一些输入(并将事件标记为已处理),我正在努力避免这种情况。
【问题讨论】:
-
Parent2 无法处理
PreviewKeyDown而不是Keydown? -
我认为如果没有一些重大的黑客攻击,您的要求是不可能的(阅读:易碎且不可取)。想到的事情是处理预览事件并重新引发父事件。或者也许有一种方法可以通过反射断开 Child2 中的处理程序。不过,这些东西都不是很可口。
-
没有办法阻止事件发生,但是您可以使用
if (myhandler) return提前退出,其中my handler应该是您自定义的布尔值以使其成为true/false根据您的需要 -
@PScr 不幸的是没有。只有当输入未被任何其他控件处理时,父 2 才应处理输入。而且我的图像中有一个错误:Parent 使用 TextInput 事件,而不是 KeyDown 事件。
标签: c# .net wpf routed-events