2011-05-14 34 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