2013-06-25 1 views
3

이벤트에서 EventHandler를 올바르게 분리하면 약간의 문제가 있습니다. 있는 UIButton에이벤트 분리 (C#)

: 홈페이지에서

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

서로 다른 이벤트에 의해 트리거 된 이벤트 구독/가입 취소를 구분할 것입니다. 하나의 버튼 클릭으로 두 이벤트 처리기를 모두 호출하는 것이 혼란 스럽습니다. –

+0

왜 이러한 함수 ('HookEvent','UnhookEvent')가 실제로 - 호출자는 이벤트에 가입하기 위해'+ ='(** 표준 **) 구문을 직접 사용합니까? –

+0

'new Button()'이 항상 올바른 시나리오는 없습니다. 적절한 버튼 컨트롤 참조를 사용해야하며 처음부터 새 컨트롤을 만들지 않아야합니다. –

답변

6

EventHandler을 새로 만들고 후 후크 방법으로 만듭니다. 그래서 당신은 OnButtonClick을 붙이지 않고 그 주위에 래퍼를 붙입니다.

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

여전히 작동합니다 코드의 나머지 부분을, 그리고 이벤트가 정상적으로 발사한다 :

는 귀하의 후크 방법을 변경

.

+0

아, 알겠습니다. 그것은 더 이해가됩니다. 감사! – Colton