2012-10-19 52 views
0

我正在使用http://wpfmdi.codeplex.com/庫來處理我的WPF應用程序中的MDI。如何通過事件處理程序傳遞發件人

我有一個包含一個子容器,其中又包含一些小窗口的畫布。我想,當小窗口之一被關閉執行一個動作,所以我試圖做到以下幾點:

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,那也是空的。我想要的只是找出哪個窗口觸發了事件。

回答

2

如果sendernull,那麼它聽起來像是你正在使用的MDI框架中的一個監督/錯誤。由於您有源代碼,因此可以修復它:找到發生事件的地點,並將this添加爲發件人。當你處理事件時,這應該給你一個參考MdiChild

+0

這就是我發現的。我應該改變這個嗎? 公共靜態只讀RoutedEvent ClosingEvent = \t \t \t EventManager.RegisterRoutedEvent( 「合」,RoutingStrategy.Bubble的typeof(ClosingEventArgs)的typeof(MdiChild)); –

+0

@DotNET應該有一些地方引發「Closing」RoutedEvent,並創建「RoutedEventArgs」。這將是設置源代碼的地方。 – Jay

1

你或許可以使用LINQ來規避這個問題:

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

編輯:其實在這種情況下,你不應該使用「本」,但「孩子」(這將指向您的MdiChild):

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

此代碼將導致內存泄漏。 – Sisyphe

+0

我試過了,它似乎工作 - 但是,如果它導致內存泄漏有另一種方法,可以採取@Sisyphe? –

+0

我認爲周杰倫是正確的,MDI框架源代碼應該被修復並給你一個合適的發送者。 – Sisyphe

相關問題