2012-10-19 54 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

相关问题