2011-05-14 35 views
1

我已经连接到LostFocus此代码,并Deactivate事件:处理引发LostFocus和停用事件

private void Window_LostFocus(object sender, EventArgs e) 
    { 
     try 
     { 
      this.Close(); 
     } 
     catch (InvalidOperationException ex) { } 
    } 

奇怪的空白catch造成的事实,即如果我关闭(按X)窗口这也引发了Deactivate甚至所以在这种情况下,我试图关闭已关闭的窗口。有没有更好的方法来处理它?

为了更清楚起见,我的方案是:我有一个窗口需要关闭lostFocus,取消激活并关闭常规XAlt+f4

回答

5

另一种选择(除了有一个IsClosing状态)是附加到关闭事件,并从停用和失去焦点事件取消,以防止它们被称为:

private void Window_Closing(object sender, EventArgs e) 
{ 
    Deactivated -= Window_Deactivated; 
    LostFocus -= Window_LostFocus; 
} 
+0

它是100%有条件的种族安全解决方案吗? – zerkms 2011-05-15 00:23:55

+1

事件处理程序被同步调用,除了这个应该只在UI线程上调用。所以除非你从后台线程向你的窗口做了一些讨厌的东西,否则这应该是线程安全的。 – ChrisWue 2011-05-15 01:12:07

1

你可以尝试这样的事:

bool IsClosing = false; 
private void Window_LostFocus(object sender, RoutedEventArgs e) 
{ 
    CloseWindow(); 
} 

private void Window_Deactivated(object sender, EventArgs e) 
{ 
    CloseWindow(); 
} 

void CloseWindow() 
{ 
    if (IsClosing == false) 
    { 
     IsClosing = true; 
     this.Close(); 
    } 
} 
+0

是的,也想过这个,但也是一个肮脏的黑客。 – zerkms 2011-05-14 09:06:26

+1

看到比这更脏的黑客... – kenny 2011-05-15 01:25:21