2013-01-02 93 views
1

我有一个简单的WPF应用程序与MainWindow。在后面的代码中设置一个未加载的事件。将MainWindow设置为启动uri。当窗口关闭时,Unloaded不会被触发。创建第二个窗口 - NotMainWindow只需点击一下按钮。奇怪的卸载行为 - WPF窗口

在按钮单击事件中,调用MainWindow。关闭MainWindow并触发卸载。 为什么行为上的差异?我想知道的是,如何获得某种空载事件单次?

<Window x:Class="WpfApplication2.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" Unloaded="Main_Unloaded"> 
<Grid> 

</Grid> 
</Window> 

    private void Main_Unloaded(object sender, RoutedEventArgs e) 
    { 

    } 

<Window x:Class="WpfApplication2.NotMainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="NotMainWindow" Height="300" Width="300"> 
<Grid> 
    <Button Content="Show Main" Height="25" Margin="10" Width="70" Click="Button_Click" /> 
</Grid> 
</Window> 


private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     MainWindow win = new MainWindow(); 
     win.Show(); 
    } 

<Application x:Class="WpfApplication2.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     StartupUri="NotMainWindow.xaml"> 
<Application.Resources> 

</Application.Resources> 
</Application> 
+0

它在关闭时未被调用。这是问题。当然,它不会被称为加载! :P – Harsha

+0

@Blachshma - 更正了问题以消除混淆。 – Harsha

+0

所以你说你创建MainWindow,然后立即关闭它,卸载不被调用? – Blachshma

回答

3

根据你的意见,我明白你谈论的场景。这是一个known issue,关闭应用程序时(例如,最后一个窗口关闭),不会调用卸载。

如果你只是想知道什么时候窗口关闭使用Closing事件:如果您想在关闭最后一个窗口了解

public MainWindow() 
{ 
    this.Closing += new CancelEventHandler(MainWindow_Closing); 
    InitializeComponent(); 
} 


void MainWindow_Closing(object sender, CancelEventArgs e) 
{ 
    // Closing logic here. 
} 

,例如您的应用程序正在关闭,您应该使用ShutdownStarted

public MainWindow() 
{ 
    this.Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted; 
    InitializeComponent(); 
} 

private void Dispatcher_ShutdownStarted(object sender, EventArgs e) 
{ 
    //do what you want to do on app shutdown 
} 
+0

嗯。这看起来很合理。我的问题是,实际上,我需要在我正在构建的控件中的Unload事件,而不是窗口本身。控件可以托管在任何一种窗口中,但它不知道它的父控件。我需要在卸载控件时进行一些清理。 :| – Harsha

+0

接受任何可能需要此问题解决方案的人的答案。 :) – Harsha