2012-04-05 197 views
2

我有Window類(例如public partial class Foo : Window),當我創建窗口時,我註冊了Closed事件。WPF窗口關閉事件用法

foo = new Foo(); 
foo.Closed += FooClosed; 


public void FooClosed(object sender, System.EventArgs e) 
{ 
} 

當有人按下foo窗口我稱之爲this.Close()內的按鈕,但我FooClosed似乎並沒有被調用。

我錯誤地註冊了該活動嗎?

更新

順便說一句,所有我想做到的是知道foo已經關閉,所以我可以設置參考回null。有沒有更好的方法來實現這一目標?

+0

它看起來不錯,但表現出多一點的上下文。在哪個類是FooClosed()以及其他代碼被調用的地方? – 2012-04-05 18:01:57

+0

顯然代碼是正確的! – 2012-04-05 18:04:35

+0

'Foo:Window'不會重寫任何'Window'事件,或者有一個隱式的析構函數/終結器,是嗎? – Alain 2012-04-05 18:20:11

回答

8

問題得到回答,前幾天檢查Execute code when a WPF closes

你可能有一些事情與你的代碼,因爲這工作對我蠻好。

MainWindow.xaml.cs

namespace WpfApplication1 
{ 

    public partial class MainWindow : Window 
    { 
     private Foo foo; 

     public MainWindow() 
     { 
      InitializeComponent(); 

      foo = new Foo(); 
      foo.Closed += FooClosed; 
      foo.Show(); 
     } 

     public void FooClosed(object sender, System.EventArgs e) 
     { 
      //This gets fired off 
      foo = null; 
     } 

    } 
} 

Foo.xaml

<Window x:Class="WpfApplication1.Foo" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Foo" Height="300" Width="300"> 
    <Grid> 
     <Button Click="Button_Click">Close</Button> 
    </Grid> 
</Window> 

Foo.xaml.cs

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for Foo.xaml 
    /// </summary> 
    public partial class Foo : Window 
    { 
     public Foo() 
     { 
      InitializeComponent(); 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      this.Close(); 
     } 
    } 
} 
+0

我現在就試試。 – Ternary 2012-04-05 18:07:11

+1

我正在做的事情和你提供的那個鏈接之間的區別是我想處理一個從窗口外部被關閉的窗口(即我沒有這樣做.closed)我從父窗口處理它。 – Ternary 2012-04-05 18:08:15

+0

@Ternary - 您確定窗口「foo」在您的映射事件有機會被調用之前沒有被破壞?也許你應該鉤住Window.Closing()來查看是否是這種情況。 – Alain 2012-04-05 18:09:36