2012-05-17 48 views
1
Button.Click += new RoutedEventHandler(_click); 

private void _click(object sender EventArgs e) 
{ 
    //... 
} 

在上面的代碼中,我們使用Button.Click事件實例化了一個代表的RoutedEventHandler類型。但事件本身就是一個抽象代表,不是嗎?我不明白這個之間的區別,只是將RoutedEventHandler實例化爲一個變量,然後將變量添加到實例的調用列表中。我是否太過分了?這裏涉及的所有代表如何工作?活動和代表

編輯:所以我主要關心的是試圖彌合我所瞭解的代表和我所瞭解的事件之間的差距。我知道一個事件是一個包裹在另一層抽象中的委託。因此,當您使用+ =運算符將另一個委託分配給其調用列表時,您只是將一個委託分配給另一個委託,對嗎?但是在我上面寫的代碼中,實際上並沒有實例化RoutedEventHandler類,所以我很困惑你是如何將它傳遞給Button.Click事件的調用列表的。我也感到困惑,因爲它看起來好像所有東西都指向其他代表事件和事件,並且引用變得複雜。

+0

您是不是要找這樣的: - RoutedEventHandler R =新RoutedEventHandler(_Click); Button.Click + = R ;? –

+0

是的;但我認爲我沒有清楚地表明我的問題。我知道如何編寫一個事件處理程序,我只是試圖在更深層次上理解事件和代表。我對代表的瞭解與我對事件的瞭解之間存在差距。我會編輯我的問題,嘗試更好地表達它。 –

回答

1

也許這個答案將有助於you.He良好的詳細解釋它: -

Events

+0

太好了,那就是我一直在尋找的細節!謝謝! –

1

您可以將事件視爲包含代表集合(包含用於添加/刪除成員的一些語法糖)的包裝。事件處理將調用多播到多個委託,您可以添加自定義邏輯以允許(或不)添加委託(與您可以在屬性中包裝字段並在屬性的getter/setter上添加一些邏輯的方式相同)。在課堂上有一個事件向全世界宣傳他們可以安全地添加處理程序(作爲代理實現)以接收所述事件 - 並允許諸如與Visual Studio等IDE集成的設計時間。

+0

感謝Carlos,這是有用的信息! –

1

當您在事件的上下文中使用委託時,編譯器將爲委託生成提供支持字段,併爲訂閱者生成附加到事件的添加/刪除公共屬性。你可以只使用委託作爲一個事件你描述然而,你將不能夠限制用戶只+ =和 - =

private EventHandler _backingDelegate; 
public event EventHandler Click { 
    add { 
     _backingDelegate += value; 
    } 
    remove { 
     _backingDelegate -= value; 
    } 
} 
+0

謝謝aqwert!好信息。 –