我在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”,那么除了事件之外的所有事情都可以。我错过了什么吗?
答案 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);