2010-04-26 75 views
3

我有一个自定义的Button类,当它被点击时(打开特定的窗口)总是执行相同的操作。我添加了一个可以在按钮的XAML中分配的Click事件,就像常规按钮一样。检查一个RoutedEvent是否有任何处理程序

当它被点击时,我想执行Click事件处理程序(如果已分配),否则我想执行默认操作。问题是显然没有办法检查是否有任何处理程序已添加到事件中。

我认为该事件为空检查将做到这一点:

if (Click == null) 
{ 
    DefaultClickAction(); 
} 
else 
{ 
    RaiseEvent(new RoutedEventArgs(ClickEvent, this));; 
} 

...但是,这并不编译。编译器告诉我,除了定义类之外的事件,除了+ =或 - =之外,我不能做任何其他事情,尽管我正在尝试在定义的类中检查这个事件。

我实现正确的行为自己,但它的丑陋和繁琐,我不相信没有一个内置的方式做到这一点。我肯定错过了什么。

下面是相关代码:

public class MyButtonClass : Control 
{ 
    //... 

    public static readonly RoutedEvent ClickEvent = 
     EventManager.RegisterRoutedEvent("Click", 
             RoutingStrategy.Bubble, 
             typeof(RoutedEventHandler), 
             typeof(MyButtonClass)); 

    public event RoutedEventHandler Click 
    { 
     add { ClickHandlerCount++; AddHandler(ClickEvent, value); } 
     remove { ClickHandlerCount--; RemoveHandler(ClickEvent, value); } 
    } 

    private int ClickHandlerCount = 0; 

    private Boolean ClickHandlerExists 
    { 
     get { return ClickHandlerCount > 0; } 
    } 

    //... 
} 

回答

1

不,这是不可能的。其实你的代码假设他们正在处理您的控制自身的事件,但你声明泡泡事件不是直接事件,因此技术上的东西可以听事件进一步向上的元素链。另外,从技术上讲,不需要使用CLR事件来挂钩事件;人们可以直接使用AddHandler方法直接传递路由事件,这就是人们必须做的事情,以便将事件进一步链接到链上。最后,如果某人为该事件注册了一个类处理程序,则不会使用该CLR事件(只要为MyButtonClass的任何实例引发该事件就会收到通知)。如果您查看UIElement.BuildRouteHelper之类的东西,您将看到WPF经过的所有步骤来建立事件路由以及在引发事件时将调用的对象。

如果您确实需要知道是否有听众,那么您最好创建一个仅限CLR的事件而不是路由事件。然后你可以检查你的委托是否为非null。

相关问题