2013-06-25 71 views
3

正確分離EventHandler與事件有一個小問題。以下是我與合作:分離事件(C#)

在的UIButton:

public void HookEvent(Action<object, EventArgs> action) 
{ 
    Click += new EventHandler(action); 
} 
public void UnhookEvent(Action<object, EventArgs> action) 
{ 
    Click -= new EventHandler(action); 
} 

在主營:

UIButton button = new Button(); 
button.HookEvent(OnButtonClick); 
button.UnhookEvent(OnButtonClick); 

正在被鉤住的功能:

public void OnButtonClick(object sender, EventArgs e) 
{ 
    throw new Exception("Event Fired"); 
} 

利用這一點,如果我將Unhook行註釋掉,然後調用Exception。但是,如果我按照上圖所示將Unhook保留在那裏,該功能仍會激活。它不會解開它。如果我在Click -= new EventHandler(action);部分下面添加Click = null;,則它按預期工作。這樣做會導致只允許一個函數在任何給定的時間被掛鉤。

我什麼可能會發生唯一的想法是,功能的新版本正在傳遞,因爲我用行動<>工作,但很可惜我甚至嘗試存儲該功能按鈕中的變量,當我去刪除它,if(storedAction == passedInAction)結果是真實的。我不知道爲什麼這不會爲我分離。

感謝您的時間夥伴!

+0

我會分開事件訂閱/取消訂閱觸發不同的事件first..to我一個按鈕點擊調用這兩個事件處理程序混淆 –

+0

爲什麼這些函數('HookEvent','UnhookEvent')實際上增加了只是讓 - 調用者直接使用'+ ='(**標準**)語法來訂閱事件? –

+0

「新的Button()」永遠不會正確。您將需要使用正確的按鈕控件引用,而不是從頭創建一個新的。 –

回答

6

您正在使用鉤子和解除鉤子方法創建新的EventHandler。所以你不附加OnButtonClick,而是一個包裝。

更改掛鉤的方法:

public void HookEvent(EventHandler action) { 
    Click += action; 
} 
public void UnhookEvent(EventHandler action) { 
    Click -= action; 
} 

你的代碼的其餘部分應該仍然工作,並且您的活動現在應該正確地觸發。

+0

哦,我明白了。這確實更有意義。謝謝! – Colton