2011-05-03 7 views
0

여러 스레드에서 Windows가있는 복잡한 WPF 응용 프로그램이 있습니다. 꽤 재현 할 수 있듯이, 새 창을 열고 닫을 때 포커스 (활성화)가 마지막으로 활성화 된 창으로 돌아 가지 않습니다. 대신 (보통) 오래된 창이 활성화됩니다. 워크 플로우는 "창 A에서 작업", "A에서 B 창, C 창", "B에서 C 작업", "B 창에서 D 창 열기", "D 닫기"이므로 포커스를 되돌리려면 windows가 필요합니다. B로 이동하지만 실제로는 A로 이동합니다.WPF에서 윈도우 정품 인증 이벤트의 출처 확인

Window.Activated 및 Window.Deactivated 이벤트에 대한 스택 트레이스를 이미 살펴 봤지만 WPF 인프라에서 직접 가져온 것으로서 단서를 보여주지는 않습니다. 나는 이미 Spy ++를 사용해 봤지만 그 유용성은 제한적이다.

어떻게 더 디버깅 할 수 있습니까?

업데이트 : D를 생성 할 때 B 스레드를 더 이상 차단하지 않은 후에 현상이 사라졌습니다. 스레드가 메시지 펌프를 차단할 때 데스크톱 창 관리자가 혼란스러워하는 경우가있는 것 같습니다. 나는 메시지 펌프 차단기를 D를 만들기 전에 배경 우선 순위를 가진 Dispatcher에 밀어 넣음으로써이 문제를 해결했습니다. 이는 DWM 혼동을 해결하고 Windows 활성화가 더 이상 작동하지 않는 것으로 보입니다. 나는 여전히 더 심층적 인 해결책/분석에 대한 지침에 관심이있다.

+0

아마도 Snoop이 도움이됩니다. http://snoopwpf.codeplex.com/ Snoop은 WPF 응용 프로그램을위한 매우 강력한 스파이 도구입니다. – Christian

+0

스눕은 이벤트 정보를 표시하지 않으며 WPF 외부에있는 이벤트 소스를 믿습니다. –

답변

0

당신이 듣고 싶지 않을 수도 있지만 이러한 상황에서 내가 취하는 다음 단계는 해당 현상의 스택에서 즉시 메소드의 참조 소스를 검사하는 것입니다.

이 설정하고 다음 일반적인 지점에서 중단 점을 설정 가져 오기, 포커스 이벤트를 말 : 당신이 전에 사용 참조 소스를했습니다 나도 몰라. 이제 스택을 찾으십시오. 스택 프레임의 대부분을 두 번 클릭하고 소스 코드를 볼 수 있어야합니다. 물론 그것은 쓰레기지만, 어떤 경우에는 메서드 이름을 보는 것보다 낫습니다.

참조 소스 측에서 일부 변수를 검사하려는 경우 해당 변수가 작동하지 않는 것을 알 수 있습니다. 이 수정 프로그램을 사용

나는 이것이 매우 구체적인 아니라는 것을 알고 있지만 내가 다음에 시도 할 것입니다.

+0

답장을 보내 주셔서 감사합니다.하지만 Q. 내 업데이트를 참조하십시오. –

관련 문제