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

093gszye  于 2023-01-21  发布在  其他
关注(0)|答案(4)|浏览(183)

我目前正在编写一个WPF应用程序,它在App.xaml.cs中执行命令行参数处理(这是必要的,因为启动事件似乎是获得这些参数的推荐方式)。基于参数,我想在那个点已经退出程序,据我所知,应该在WPF中使用Application.Current.Shutdown()完成,或者在本例中(就像我在当前应用程序对象中一样)可能也只使用this.Shutdown()
唯一的问题是,这似乎不工作的权利。我已经逐步通过调试器和代码后,Shutdown()行仍然得到执行,导致错误之后的方法,因为我预计应用程序不会生存那么长时间。而且主窗口(声明在StartupUri属性的XAML)仍然得到加载。
我已经检查了该方法的文档,在注解中没有发现任何东西告诉我不应该在Application.StartupApplication期间使用它。
那么,在那个时候退出程序的正确方法是什么,例如Application对象中的Startup事件处理程序?

w1jd8yoj

w1jd8yoj1#

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

rur96b6h2#

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

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

@Frank Schwieterman,这些东西可能会帮助您解决控制台窗口问题。

vxqlmq5t

vxqlmq5t3#

为了避免设置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);
    }
6qftjkof

6qftjkof4#

写入应用程序启动:

private void Application_Startup(object sender, StartupEventArgs e)  
{  
    ...
    if (!condition)  
    {  
        e.GetType()  
          .GetProperty("PerformDefaultAction", BindingFlags.Instance | BindingFlags.NonPublic)  
          .SetValue(e, false);  
        Shutdown();  
        return;  
    }  
    ...
}

相关问题