2012-03-31 86 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