防止子控件接收路由事件

时间:2015-09-24 15:03:32

标签: c# .net wpf routed-events

让我说我在视觉树中的某个地方有我的用户控件。父和子是我无法修改的第三方控件。我想在我的控件中过滤键盘事件,以便 children 控件不会收到一些键盘事件,但父控件会这样做。

我试着用一些图解释我想要实现的目标。如果控件不处理键盘事件,则所有事件都会通过可视树反弹:

enter image description here

但是,f.e。当用户按 A 时,

  1. Child2.OnPreviewKeyDown()不应该被称为
  2. Parent2.OnTextInput仍应收到活动 enter image description here
  3. 我可以在e.Handled = true中设置MyControl.PreviewKeyDown来实现(1)。问题是在这种情况下不会生成TextInput事件: enter image description here

    有没有办法像第二张图片一样实现行为?

    加了: 我试图解决的问题是第三方控件(Child 2)在OnPreviewKeyDown中窃取了一些输入(并将事件标记为已处理),我试图避免这种情况。

1 个答案:

答案 0 :(得分:0)

在WPF中通常可以执行的处理被抑制事件的方法是在代码中添加处理程序并重新引发事件。为此,请使用UIElement.AddHandler()方法,例如:

child2.AddHandler(UIElement.TextInput, new TextCompositionEventHandler(nameOfYourHandlerFunction), true);

即使设置了Handled标志,'true'布尔值也会使nameOfYourHandlerFunction触发。这样做不会自动重新起泡,因此您需要再次举起活动。

base.RaiseEvent(e);

这适用于具有Bubble的路由策略的事件。