派生类中的事件

时间:2011-10-18 06:47:33

标签: c# wpf

我在UserControl类Main中声明了一个事件:

public static readonly RoutedEvent CloseEvent = EventManager.RegisterRoutedEvent(
    "CloseClick", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(Main));
public event RoutedEventHandler CloseClick
{
    add { AddHandler(CloseEvent, value); }
    remove { RemoveHandler(CloseEvent, value); }
}

此代码应该有效,因为我在其他类中使用过。问题是当我试图在另一个班级听这个事件时。

UserControl content;
if (value == "main")
{
    content = new Main();
    content.CloseClick += new RoutedEventHandler(closeClick);
} else {
    ...
    ...
}
MasterPage.addContent(content);

我希望“content”属于从UserControl派生的任何类型。 如果我将“content”声明为“Main”类型,则会找到该事件但是如果它被声明为BaseClass“UserControl”,那么除了事件之外的所有事情都可以。我错过了什么吗?

3 个答案:

答案 0 :(得分:1)

这应该如何正常运作。我的意思是Main是该事件来源的正确类型,而不是UserControl(可以是任何东西)。

如果您想要为任何userControl引发事件,请创建Attached Routed Events。它们可以从任何DependencyObject(即Main或base UserControl或两者)中提出。

答案 1 :(得分:0)

我不知道我是否理解你的问题。我认为您正在将派生类转换为其基类,然后尝试使用派生类中存在的事件。

如果“Main”派生自UserControl,并且您将“Main”对象声明为“UserControl”,则只有基类方法,属性和事件(“UserControl”中存在的那些)应该可用。这就是所谓的向下转型。

答案 2 :(得分:0)

您可以先定义基类并将CloseClick事件放入其中。然后你的其他用户控件继承这个基类

class MyBaseUserControl : UserControl
{
    public static readonly RoutedEvent CloseEvent = EventManager.RegisterRoutedEvent(
    "CloseClick", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(Main));
    public event RoutedEventHandler CloseClick
    {
        add { AddHandler(CloseEvent, value); }
        remove { RemoveHandler(CloseEvent, value); }
    }
}

MyBaseUserControl content;
if (value == "main")
{
    content = new Main();
    content.CloseClick += new RoutedEventHandler(closeClick);
} else {
    ...
    ...
}
MasterPage.addContent(content);