当前位置: 首页 > 编程语言 > C#

检查RoutedEvent是否有任何处理程序共享

时间:2023-04-10 21:07:30 C#

检查RoutedEvent是否有任何处理程序我有一个自定义Button类,它在单击时始终执行相同的操作(打开特定窗口)。我正在添加一个可以在按钮的XAML中分配的Click事件,就像常规按钮一样。单击时,如果已分配,我想执行Click事件处理程序,否则我想执行默认操作。问题是显然没有办法检查是否有任何处理程序已添加到事件中。我认为对事件进行空检查会这样做:if(Click==null){DefaultClickAction();}else{RaiseEvent(newRoutedEventArgs(ClickEvent,this));}...但是那不会编译。编译器告诉我,除了+=或-=之外,我不能对定义类之外的事件执行任何操作,即使我试图在定义类内部执行此检查。我自己实现了正确的行为,但它既丑陋又冗长,我不敢相信没有内置的方法可以做到这一点。我肯定错过了什么。这是相关代码:publicclassMyButtonClass:Control{//...publicstaticreadonlyRoutedEventClickEvent=EventManager.RegisterRoutedEvent("Click",RoutingStrategy.Bubble,typeof(RoutedEventHandler),typeof(MyButtonClass));公共事件RoutedEventHandler点击{添加{ClickHandlerCount++;添加处理程序(单击事件,值);}删除{ClickHandlerCount--;RemoveHandler(ClickEvent,值);}}私有intClickHandlerCount=0;privateBooleanClickHandlerExists{get{returnClickHandlerCount>//0.}..}不,这是不可能的。实际上,您拥有的代码假设他们正在处理您自己的事件,但您声明的是Bubble事件而不是Direct事件,因此从技术上讲,某些东西可能会在元素链的更上方监听事件。另外,从技术上讲,不需要使用CLR事件来挂钩事件;可以使用AddHandler方法直接传递您的路由事件,这就是将事件挂接到链上所要做的全部工作。最后,如果有人为该事件注册了一个类处理程序(在为MyButtonClass的任何实例引发该事件时得到通知),则不会使用CLR事件。如果您查看UIElement.BuildRouteHelper之类的内容,您会发现WPF经历了所有步骤来构建事件路由和引发事件时将调用的对象。如果您真的需要知道是否有任何侦听器,那么最好创建一个仅限CLR的事件而不是路由事件。然后你可以检查你的委托是否不为空。以上是C#学习教程:查看是否有RoutedEvent的handler。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: