2017-04-14 6 views
0

이것은 디버깅을위한 것입니다. 그리고 다른 장치에서 테스트 중이므로 Visual Studio를 디버깅에 사용할 수 없습니다.하나의 메소드가 많은 이벤트를 처리하는 경우, 핸들러가 응답하는 이벤트를 알려주는 방법이 있습니까?

바로 지금 수행 할 수있는 최선의 방법은 구체적인 EventArgs 파생 클래스가 처리기로 전달되는지 확인하는 것입니다. 좀 더 구체적으로 처리하고 그것을 처리하는 메소드에서 정확한 이벤트가 호출되는 것을 볼 수있는 방법이 있습니까?

ContentControl cc = my_button; 
cc.DragEnter += LogEvent; 
cc.DragLeave += LogEvent; 
cc.GotFocus += LogEvent; 
cc.GotMouseCapture += LogEvent; 
cc.GotStylusCapture += LogEvent; 

... 

private void LogEvent(object sender, EventArgs e) 
{ 
    ContentControl cc = (ContentControl)sender; 
    my_textBlock.Inlines.Add(cc.Name + " " + e.ToString() + Environment.NewLine); 
} 

나는이 질문을 좀 더 일반적인 용어로 넣고 물어볼 수 있다고 가정합니다. 어떤 대리인이 위임자를 호출하는지 알려줄 수 있습니까?

답변

1

통화 스택 밖으로 끌어낼 수 있어야합니다. 당신이 시도 할 수 Enviroment.StackTrace 또는 System.Diagnostics.StackTrace

+0

스택 추적을 다루는 것은 매우 위험합니다. 디버그 및 릴리스 스택 추적은 컴파일러 최적화로 인해 다를 수 있습니다. 나중에 코드가 난독 화 될 수 있으므로 솔루션이 작동을 멈 춥니 다. – oldovets

+0

감사, oldovets. 코드가 단지 디버깅 목적을위한 것이라면 괜찮을 것이라고 생각합니다. –

+0

좋습니다. Enviroment.StackTrace는 긴 문자열이며 올바른 조각을 추출하기가 어렵습니다. 그러나 몇 가지 실험 후에 새로운'System.Diagnostics.StackTrace() .GetFrame (4) .GetMethod(). Name'이 꽤 잘 작동하는 것 같습니다. –

2

살펴 보자

cc.DragEnter += (sender,e) => LogEvent("DragEnter",sender); 
cc.DragLeave += (sender,e) => LogEvent("DragLeave",sender); 
cc.GotFocus += (sender,e) => LogEvent("GotFocus",sender); 
cc.GotMouseCapture += (sender,e) => LogEvent("GotMouseCapture",sender); 
cc.GotStylusCapture += (sender,e) => LogEvent("GotStylusCapture",sender); 

private void LogEvent(string eventName,object sender) { 
    ContentControl cc = (ContentControl)sender; 
    my_textBlock.Inlines.Add(cc.Name + " " + eventName); 
} 
+0

영리 하긴하지만 30 개 또는 40 개의 이벤트 리스너를 입력하는 과정이 느려집니다. –