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

C# 从App.xaml.cs关闭WPF应用程序,c#,wpf,application-shutdown,C#,Wpf,Application Shutdown,我目前正在编写一个WPF应用程序,它在App.xaml.cs中执行命令行参数处理(这是必要的,因为启动事件似乎是获取这些参数的推荐方式)。根据参数,我想在该点退出程序,据我所知,这应该在WPF中使用Application.Current.Shutdown()完成,或者在这种情况下(就像我在当前应用程序对象中一样),也可能是this.Shutdown() 唯一的问题是,这似乎不起作用。在Shutdown()行仍然被执行之后,我已经完成了调试器和代码的调试,这会导致方法中的错误,因为我希望应用程序不

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

唯一的问题是,这似乎不起作用。在
Shutdown()
行仍然被执行之后,我已经完成了调试器和代码的调试,这会导致方法中的错误,因为我希望应用程序不会运行那么久。此外,主窗口(在XAML的StartupUri属性中声明)仍然会被加载

我检查了该方法的文档,在备注中没有发现任何内容告诉我不应该在
应用程序启动期间使用它


那么,在这一点上退出程序的正确方式是什么,即:。
应用程序
对象中的
启动
事件处理程序

首先从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);
        }
    }

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

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

@Frank Schwieterman,这方面的内容可能会帮助您解决控制台窗口问题。

我做了一些不同的事情,以避免设置
StartupUri
ShutdownMode
属性。首先编辑
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>

你会犯什么错误?请更新您的问题。单击以获得简单有效的答案仍然不正确:(特别是我在主窗口的构造函数中遇到了NullReferenceExceptions,这可能很容易避免。但据我所知,关闭应用程序应该可以在不实例化StartupUri引用的窗口的情况下工作。我更改了答案,以向您展示如何避免创建主窗口。这一点很重要。)首先,请从App.xaml.Thank中删除StartupUri。它现在可以工作了。但我发现无论应用程序是否应该已经退出,始终加载StartupUri都有点不直观。如果您试图从
InitApplication()关闭,则此操作不起作用
,就像我的例子一样。即使
StartupUri
为空,因为我没有主窗口,所以在我的例子中已经是空的,
这个.Shutdown()
没有效果。
InitApplication()
OnStartup()
之前执行,所以我必须在
InitApplication()期间设置一个布尔值
,然后调用
return
,检查
OnStartup()
中的布尔值,然后如上所述退出。此页面非常清楚地详细介绍了WPF启动和关闭过程。。。
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);
    }