2012-10-19 4 views
0

http://wpfmdi.codeplex.com/ 라이브러리를 사용하여 WPF 응용 프로그램의 MDI를 처리하고 있습니다.보낸 사람을 이벤트 처리기를 통해 전달하는 방법

하위 컨테이너가 들어있는 하위 컨테이너가있는 Canvas가 있습니다. 하위 컨테이너에는 여러 개의 작은 창이 있습니다. 나는 작은 창 중 하나가 닫힐 때 작업을 수행하고자하는, 그래서 나는 다음을 수행하려고 : 윈도우가 닫힐 때 방법이 성공적으로 입력

MdiChild child = new MdiChild(); 
child.Closing += new RoutedEventHandler(DatabaseTableWindow_Closing); 

private void DatabaseTableWindow_Closing(object sender, RoutedEventArgs e) 
     { 
      object s = e.Source; 
     } 

동안, e.Source가 null입니다. 나는 또한 sender을 확인했으며 이는 역시 null입니다. 내가 원한 것은 이벤트를 일으킨 창을 찾는 방법입니다.

답변

2

sendernull 인 경우 사용중인 MDI 프레임 워크의 감시/버그처럼 들립니다. 소스가 있으므로 수정할 수 있습니다. Closing 이벤트가 발생한 위치를 찾고 this을 보낸 사람으로 추가하십시오. 이벤트를 처리 할 때 MdiChild에 대한 참조를 제공해야합니다.

child.Closing += (o,e) => { DatabaseTableWindow_Closing(this, e); }; 

편집 :

+0

이것은 내가 발견 한 것입니다. 이걸 바꿔야 하나? 공공 정적 판독 전용 RoutedEvent ClosingEvent = \t \t \t EventManager.RegisterRoutedEvent (의 typeof RoutingStrategy.Bubble의 typeof (ClosingEventArgs) (MdiChild)를 "닫기"); –

+0

@DotNET "Closing"'RoutedEvent'가 발생하고'RoutedEventArgs'가 생성 된 곳이 있어야합니다. 이것은 소스를 설정하는 장소가 될 것입니다. – Jay

1

당신은 아마 문제를 회피하기 위해 LINQ를 사용할 수있는 사실이 경우에 당신은 "이"지만, "아이"를 사용하지 않아야을 (이 당신의 MdiChild를 가리키는 것) :

MdiChild child = new MdiChild(); 
child.Closing += (o,e) => { DatabaseTableWindow_Closing(child, e); }; 
+0

이 코드는 메모리 누수를 일으킬 수 있습니다. – Sisyphe

+0

나는 그것을 시도하고 작동하는 것 같다 - 그러나 그것은 메모리 누수가 발생할 경우 @ Sisyphe 취할 수있는 또 다른 접근법이 무엇입니까? –

+0

제이 (Jay)가 옳다고 생각합니다. MDI 프레임 워크 소스 코드가 수정되어 적절한 발신자를 제공해야합니다. – Sisyphe

관련 문제