2011-10-18 77 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

這個解決方案可以工作,但是我最終會得到很多隻有少數事件處理程序的類。 –