2011-10-18 40 views
0

已经宣布在我的用户控件类主要事件:事件在派生类

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); 

我想要“内容”是来自UserControl的任何类型。 如果我将“content”声明为类型“Main”,则发现该事件,但如果声明为BaseClass“UserControl”,则该事件的所有内容都将工作。我错过了什么吗?

回答

1

这就是它应该如何工作的权利。我的意思是Main是该事件源的正确类型,而不是UserControl(可以是任何东西)。

如果您想要为任何userControl引发的事件,请创建一个Attached Routed Events。它们可以来自任何依赖对象(即Main或基地UserControl或两者)。

+0

谢谢,这解决了我的问题。 –

0

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

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

+0

问题是,我不能声明类为“主”,因为它内部的if语句。将“内容”重新声明为“主要”可能会解决问题,但不适合。 –

+0

我假设你在if块外面声明了UserControl对象,因为取决于if条件,你将使用Main类或另一个也从UserControl派生的类,并且稍后将添加到masterpage中。 因此,如果不在if块外声明内容对象,而是用其正确类型声明内部对象,并向每个“if”情况添加MasterPage.AddContent句子? –

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); 
+0

这个解决方案可以工作,但是我最终会得到很多只有少数事件处理程序的类。 –