C# 防止子控件接收路由事件
假设我的用户控件位于可视化树中的某个位置。父控件和子控件是我无法修改的第三方控件。我希望筛选控件中的键盘事件,以便子控件不接收某些键盘事件,而父控件接收 我将尝试用一些图表来解释我想要实现的目标。如果控件不处理键盘事件,则所有事件都会在可视树中反弹: 但是,f.e.当用户按下C# 防止子控件接收路由事件,c#,.net,wpf,routed-events,C#,.net,Wpf,Routed Events,假设我的用户控件位于可视化树中的某个位置。父控件和子控件是我无法修改的第三方控件。我希望筛选控件中的键盘事件,以便子控件不接收某些键盘事件,而父控件接收 我将尝试用一些图表来解释我想要实现的目标。如果控件不处理键盘事件,则所有事件都会在可视树中反弹: 但是,f.e.当用户按下 不应调用Child2.OnPreviewKeyDown() 但Parent2.ontextireput仍应接收事件 我可以通过在MyControl.PreviewKeyDown中设置e.Handled=true来实现(
Parent2.ontextireput
仍应接收事件
e.Handled=true
来实现(1)。问题是在这种情况下,不会生成TextInput
事件:
有没有一种方法可以达到第二张图片上的行为
添加:
我试图解决的问题是,第三方控件(子控件2)窃取OnPreviewKeyDown中的一些输入(并将事件标记为已处理),我试图避免这种情况。在WPF中处理被抑制事件通常可以做的是在代码中添加处理程序并重新引发事件。为此,请使用以下方法,例如:
child2.AddHandler(UIElement.TextInput, new TextCompositionEventHandler(nameOfYourHandlerFunction), true);
即使设置了handler标志,“true”布尔值也会使nameOfYourHandlerFunction启动。这样做,事件不会自动重新冒泡,因此您需要再次引发事件
base.RaiseEvent(e);
这适用于路由策略为Bubble的事件。在WPF中处理被抑制事件的一般方法是在代码中添加处理程序并重新引发事件。为此,请使用以下方法,例如:
child2.AddHandler(UIElement.TextInput, new TextCompositionEventHandler(nameOfYourHandlerFunction), true);
即使设置了handler标志,“true”布尔值也会使nameOfYourHandlerFunction启动。这样做,事件不会自动重新冒泡,因此您需要再次引发事件
base.RaiseEvent(e);
这适用于路由策略为Bubble的事件。Parent2无法处理
PreviewKeyDown
而不是Keydown
?您读过这篇文章吗?我认为如果没有一些重大的改动,您的要求是不可能的(阅读:脆弱且不可取)。我想到的是处理预览事件并在父级上重新激活该事件。或者有一种方法可以通过反射断开Child2中的处理程序。但是,这两件事都不是很令人满意。没有办法阻止命中事件,但是您可以使用if(myhandler)return
,提前退出,其中,my handler
应该是一个布尔值,您可以根据自己的需要自定义它,使之成为true
/false
needs@PScr不幸的是,不是。只有当输入没有被任何其他控件处理时,父2才应该处理输入。我在图片中犯了一个错误:Parent2使用的是TextInput事件,而不是KeyDown事件。Parent2无法处理PreviewKeyDown
而不是KeyDown
?你读过这篇文章吗?我认为如果没有一些重大的破解,你的问题是不可能的(阅读:脆弱且不可取)。我想到的是处理预览事件并在父级上重新激活该事件。或者有一种方法可以通过反射断开Child2中的处理程序。但是,这两件事都不是很令人满意。没有办法阻止命中事件,但是您可以使用if(myhandler)return
,提前退出,其中,my handler
应该是一个布尔值,您可以根据自己的需要自定义它,使之成为true
/false
needs@PScr不幸的是,不是。只有当输入没有被任何其他控件处理时,父2才应该处理输入。我在图片中犯了一个错误:Parent使用的是TextInput事件,而不是KeyDown事件。根据他所写的内容:他无法在Parent2中附加处理程序,因为它是第三方内部控件,因此他无法添加您描述的处理程序。此外,我认为处理preview key down事件将防止触发TextInput事件,因此这也不起作用。使用父控件的情况比使用子控件的情况要好。我可以找到它的参考资料。但无论如何,如果处理了KeyDown或KeyUp,则根本不会触发TextInput事件。或者,您可以手动处理并重新引发child2上的KeyDown或KeyUp事件(以消耗的为准),方式与使路由事件继续冒泡通过child2的方式大致相同。如果AddHandler函数在child2上真的不起作用,我会非常惊讶,除非它不是一个WPF控件(就像您托管的是一个Windows窗体控件)。即使设置了Handled标志,WPF中的路由事件仍会转发到下一个侦听器。在AddHandler中设置“true”标志是处理此类事件的方法。根据他所写的:他无法在Parent2中附加处理程序,因为它是第三方内部控件,因此他无法按照您的描述添加此处理程序。此外,我认为处理preview key down事件将防止触发TextInput事件,因此这也不起作用。使用父控件的情况比使用子控件的情况要好。我可以找到它的参考资料。但无论如何,如果处理了KeyDown或KeyUp,则根本不会触发TextInput事件。或者,您可以手动处理并重新引发child2上的KeyDown或KeyUp事件(以消耗的为准),方式与使路由事件继续冒泡通过child2的方式大致相同。如果AddHandler函数在child2上真的不起作用,我会非常惊讶,除非它不是一个WPF控件(就像您托管的是一个Windows窗体控件)。即使设置了Handled标志,WPF中的路由事件仍会转发到下一个侦听器。在AddHandler中设置“true”标志是处理此类事件的方法。