从App.xaml.cs关闭WPF应用程序

时间:2009-03-03 11:36:12

标签: c# wpf application-shutdown

我目前正在编写一个WPF应用程序,它在App.xaml.cs中执行命令行参数处理(这是必要的,因为Startup事件似乎是获取这些参数的推荐方法)。根据我想要退出程序的参数,据我所知,应该在带有Application.Current.Shutdown()的WPF中完成,或者在这种情况下(因为我在当前的应用程序对象中)可能也只是this.Shutdown()

唯一的问题是这似乎不正常。在Shutdown()行仍然执行后,我已经逐步调试了调试器和代码,这导致了方法之后的错误,因为我预计应用程序不能存活那么长时间。

还会加载主窗口(在XAML的StartupUri属性中声明)

我查看了该方法的文档,但在评论中没有发现任何内容,告诉我在Application.StartupApplication期间我不应该使用它。

那么,那时退出程序的正确方法是什么,i。即Startup对象中的Application事件处理程序?

3 个答案:

答案 0 :(得分:50)

首先从App.xaml中删除StartupUri属性,然后使用以下命令:

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        bool doShutDown = ...;

        if (doShutDown)
        {
            Shutdown(1);
            return;
        }
        else
        {
            this.StartupUri = new Uri("Window1.xaml", UriKind.Relative);
        }
    }

答案 1 :(得分:8)

如果从app.xaml中删除具有MainWindow的应用程序的StartupUri,则需要确保在OnStartup方法中进行以下调用,否则当MainWindow关闭时应用程序将不会终止。

this.ShutdownMode = System.Windows.ShutdownMode.OnMainWindowClose;

@Frank Schwieterman,这些内容可以帮助您解决控制台窗口问题。

答案 2 :(得分:0)

我做了一些不同的操作,以避免必须设置StartupUriShutdownMode属性。首先编辑App.xaml文件,并将StartupUri替换为Startup

<Application x:Class="Menu.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:local="clr-namespace:Menu"
         Startup="Application_Startup">
    <Application.Resources>
    </Application.Resources>
</Application>

然后将Application_StartupOnExit一起添加到代码中:

public partial class App : Application
{
    private volatile static Mutex s_mutex;

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        s_mutex = new Mutex(true, @"Global\MenuMutex", out bool grantedOwnership);

        if (!grantedOwnership)
        {
            MessageBox.Show($"Another instance is already running!", "Error", MessageBoxButton.OK, MessageBoxImage.Exclamation);
            Current.Shutdown();
        }
        else
            new MainWindow().Show();
    }

    protected override void OnExit(ExitEventArgs e)
    {
        s_mutex?.ReleaseMutex();
        s_mutex?.Dispose();
        s_mutex = null;
        base.OnExit(e);
    }