关闭主窗口时WPF应用程序不关闭

eig*_*tx2 68 c# wpf window visual-studio-2010

我习惯于Visual Studio中的WinForms编程,但我想尝试一下WPF.

我为我的项目添加了一个名为Window01的窗口.主窗口称为MainWindow.在public MainWindow()构造函数之前,我声明了Window01:

Window01 w1;
Run Code Online (Sandbox Code Playgroud)

现在我将实例化此窗口:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    w1 = new Window01();            
}
Run Code Online (Sandbox Code Playgroud)

我有一个按钮,显示窗口:w1.ShowDialog();.

这里的"有趣"事实是,如果我启动应用程序(使用调试)并在几秒钟之后退出它(我在应用程序中没有做任何事情),Visual Studio不会停止调试,就好像应用程序是仍在运行.

如果我将行移动w1 = new Window01();到按钮单击方法,意思就在上面ShowDialog(),Visual Studio的行为正常 - 也就是说,当我退出应用程序时调试停止.

为何这种奇怪的行为?

Bob*_*orn 119

在你的MainWindow.xaml.cs,尝试这样做:

protected override void OnClosed(EventArgs e)
{
    base.OnClosed(e);

    Application.Current.Shutdown();
}
Run Code Online (Sandbox Code Playgroud)

根据此链接,您还可以ShutdownMode在XAML中设置:

http://msdn.microsoft.com/en-us/library/system.windows.application.shutdownmode.aspx

<Application
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="MainWindow.xaml"
    ShutdownMode="OnExplicitShutdown"
    >
</Application>
Run Code Online (Sandbox Code Playgroud)

应用程序仅在调用Shutdown方法时停止运行Application.关闭可以隐式或显式发生,由ShutdownMode属性的值指定.

如果设置ShutdownModeOnLastWindowClose,则当应用程序中的最后一个窗口关闭时,Windows Presentation Foundation(WPF)会隐式调用Shutdown,即使当前实例化的任何窗口都设置为主窗口(请参阅MainWindow).

ShutdownModeOnMainWindowClose原因WPF隐式调用shutdown当主窗口关闭,即使其他窗口是当前打开的.

某些应用程序的生命周期可能不依赖于主窗口或最后一个窗口何时关闭,或者根本不依赖于窗口.对于这些场景,您需要将ShutdownMode属性设置为OnExplicitShutdown,这需要显式Shutdown方法调用来停止应用程序.否则,应用程序将继续在后台运行.

ShutdownMode 可以从XAML以声明方式配置,也可以从代码以编程方式配置.

此属性仅可从创建该Application对象的线程中获得.


在您的情况下,应用程序没有关闭,因为您可能使用默认值OnLastWindowClose:

如果设置ShutdownModeOnLastWindowClose,则当应用程序中的最后一个窗口关闭时,WPF会隐式调用Shutdown,即使当前实例化的任何窗口都设置为主窗口(请参阅参考资料MainWindow).

由于您打开一个新窗口而不关闭它,因此不会调用shutdown.


Mas*_*tic 26

我很高兴你得到了答案,但为了别人的缘故,我会回答你的问题,以便添加一些信息.


步骤1

首先,如果您希望程序在主窗口关闭时退出,则需要指定,因为这不是WinForms,此行为是默认的.

(WPF中的默认值是最后一个窗口关闭时)

在代码中

转到您的应用程序实例在入口点(在VS 2012的WPF程序默认是内部嵌套的App.xaml,所以去里面并导航到App.xaml.cs与创建一个构造函数).

在构造函数中指定您ApplicationShutdownMode应该是ShutdownMode.OnLastWindowClose.

    public App()
    {
        ShutdownMode = ShutdownMode.OnLastWindowClose;
    }
Run Code Online (Sandbox Code Playgroud)

在XAML中

转到您App.xaml的是VS 2012默认情况下创建的文件(或自己创建)的根是Application,里面指定你ApplicationShutdownMode应该是ShutdownMode.OnLastWindowClose.

<Application x:Class="WpfApplication27.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         StartupUri="MainWindow.xaml"
         ShutdownMode="OnMainWindowClose">
Run Code Online (Sandbox Code Playgroud)

如果它有效,你就完成了; 你可以停止阅读


第2步

如果以上不起作用(我猜你是从头开始编写WPF应用程序),主窗口可能不知道应用程序作为主窗口.所以尽可能指定.

在代码中

像在步骤1中一样转到应用程序的构造函数,并指定它Application.MainWindow价值是你的Window:

MainWindow = mainWindow;
Run Code Online (Sandbox Code Playgroud)

在XAML中

Application像在步骤1中一样转到XAML,并指定它Application.MainWindow价值是你的Window:

MainWindow = "mainWindow";
Run Code Online (Sandbox Code Playgroud)

替代

我不认为这是最好的办法,只是因为WPF不希望你这样做(所以它ApplicationShutdownMode),但你可以只使用一个事件/重写的事件方法(OnEventHappened).

转到MainWindow的代码隐藏文件并添加:

    protected override void OnClosed(EventArgs e)
    {
        base.OnClosed(e);

        App.Current.Shutdown();
    }
Run Code Online (Sandbox Code Playgroud)

  • 你的答案比标记的那个更好. (3认同)

Joe*_*ley 11

因为WPF应用程序中的默认关闭模式是OnLastWindowClose,这意味着应用程序在最后一个窗口关闭时停止.

实例化新的Window对象时,它会自动添加到应用程序中的窗口列表中.因此,问题是您的应用程序在启动时创建了两个窗口 - MainWindow和尚未显示的Window01 - 如果您只关闭了MainWindow,Window01将保持您的应用程序运行.

通常,您将使用将调用其ShowDialog的相同方法创建窗口对象,并且每次显示对话框时都将创建一个新窗口对象.