2012-03-31 82 views
0

有一個函數可以打開並顯示一個新窗口。我想給這個窗口關閉一個條件。我在下面寫了我想要的僞代碼。捕捉窗口的返回

private void fnc (object sender, RoutedEventArgs e) 
{ 
    MyWindow nw = new MyWindow(); 

    nw.Show(); 

    // Pseudo code: When (nw.Close()) {do something} 
} 

回答

4
private void fnc (object sender, RoutedEventArgs e) 
{ 
    MyWindow nw = new MyWindow(); 

    nw.Show(); 

    // inline 
    nw.Closed += (s1, e1) => Debug.WriteLine("Closed"); 

    // or 
    nw.Closed += (s1, e1) => 
         { 
          Debug.WriteLine("Closed"); 

         }; 

    // or 
    w.Closed += OnWindowClosed; 
} 

private void OnWindowClosed(object s, EventArgs e) 
{ 
    Debug.WriteLine("Closed"); 
} 
+0

對於內聯版本,它說:'名爲'e'的局部變量不能在此範圍內聲明,因爲它會給'e'賦予不同的含義,這已經是在'父或當前'範圍中使用來表示別的東西' – Shibli 2012-03-31 21:59:43

+1

@Shibli這是因爲你的func已經接受了一個e參數,你將不得不命名你的lambda的東西不同。我個人更喜歡使用明確的命名(根據我的答案),以便知道變量實際是什麼(不依賴於智能感知)......只是將(s,e)更改爲諸如(s,eventArgs)之類的東西或其他e – 2012-03-31 22:01:41

+1

對不起,我的'e'與RoutedEventArgs e發生衝突。改變了答案。 – Phil 2012-03-31 22:04:12

1

你想使用ShowDialog()。這會讓你的代碼等到新窗口返回。

private void fnc (object sender, RoutedEventArgs e) 
{ 
    MyWindow nw = new MyWindow(); 
    nw.ShowDialog(); 
    //Do something when nw returns 
} 

或者,如果你不想你的父窗口凍結起來,那麼你將有附加到Window.Closed

private void fnc (object sender, RoutedEventArgs e) 
{ 
    MyWindow nw = new MyWindow(); 
    nw.Closed += nw_Closed; 
    nw.Show(); 
} 

private void new_Closed(object sender, CancelEventArgs e) 
{ 
    //Do Something 
} 

使用lambda表達式,如果你沒有,你可以使用內聯委託有一個方法早已準備好,也:

private void fnc (object sender, RoutedEventArgs e) 
{ 
    MyWindow nw = new MyWindow(); 
    nw.Closed += (sender, cancelEventArgs) => 
     { 
      //Do Something 
     }; 
    nw.Show(); 
} 
+0

問題是關於WPF不是Windows窗體 – Phil 2012-03-31 21:48:04

+0

@Phil謝謝,我錯過了,並更新了我的答案 – 2012-03-31 21:57:55