37

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

唯一的问题是这似乎无法正常工作。在该行仍然执行之后,我已经逐步完成了调试器和代码,Shutdown()这导致该方法之后出现错误,因为我预计应用程序不会存活那么久。此外,主窗口(在 XAML 的 StartupUri 属性中声明)仍会被加载。

我检查了该方法的文档,并在评论中没有发现任何内容告诉我我不应该在期间Application.Startup或根本不使用它Application

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

4

3 回答 3

59

首先从 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);
        }
    }
于 2009-03-03T11:49:43.050 回答
9

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

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

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

于 2013-02-15T18:14:46.550 回答
0

我做了一些不同的事情,以避免必须设置StartupUriandShutdownMode属性。首先编辑App.xaml文件并替换StartupUriStartup

<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_Startup到代码中OnExit

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);
    }
于 2020-06-11T21:56:49.913 回答