C# 应用程序启动事件限制(错误?)

C# 应用程序启动事件限制(错误?),c#,wpf,window,C#,Wpf,Window,它说,我可以将事件用于很多事情,比如初始化、创建多个表单等等 但是,请尝试创建新的WPF应用程序并添加此事件处理程序: private void App_Startup(object sender, StartupEventArgs e) { Window window = new Window(); } 关闭主窗口后,应用程序将挂起在内存中。此时暂停在VS中执行将删除一个丑陋的崩溃调用堆栈窗口,其中有许多调用远离我的源代码 有什么想法吗 注意:我需要实

它说,我可以将事件用于很多事情,比如初始化、创建多个表单等等

但是,请尝试创建新的WPF应用程序并添加此事件处理程序:

    private void App_Startup(object sender, StartupEventArgs e)
    {
        Window window = new Window();
    }
关闭主窗口后,应用程序将挂起在内存中。此时暂停在VS中执行将删除一个丑陋的崩溃调用堆栈窗口,其中有许多调用远离我的源代码

有什么想法吗

注意:我需要实例化我的所有窗口,以便进行一次自学习配置。我应该去别的地方吗

让我举一个更好的例子,上面的例子很好地再现了这个问题,似乎很难理解我到底在做什么。我删除StartupUri,然后:

    private void App_Startup(object sender, StartupEventArgs e)
    {
        // un-comment this line to reproduce the problem:
        // Window window = new Window();

        // actual implementation will be
        // Window1 window1 = new Window1();
        // Window2 window2 = new Window2();
        // Window3 window3 = new Window3();
        // Window4 window4 = new Window4();
        // ...

        // start main window as usually
        MainWindow mainWindow = new MainWindow();
        mainWindow.Show();
    }
为什么我需要windows window1,…2,…3,…的实例。。。?因为它们的内容将被检查以创建我要保存其配置的控件列表。其中一些窗口将永远不会向用户显示,例如,如果用户不是管理员,则其中一些窗口是弹出窗口,一些窗口是编辑器,等等。因此,我不想显示它们。但在任何应用程序启动时,都必须创建并保存配置。我现在正在寻找这样做的地方

令人惊讶的是,使用专用事件启动似乎在创建多个窗口但不显示它们方面存在一些问题。问题是为什么以及如何解决它

测试多一点。请尝试此代码并向我解释,为什么应用程序关闭时不显示任何窗口

还有问题。我该怎么办

一些有用但有气味的东西:

    private void App_Startup(object sender, StartupEventArgs e)
    {
        Window window = new Window();

        MainWindow mainWindow = new MainWindow();
        mainWindow.ShowDialog();
        Shutdown();
    }
请注意,调用ShowDialog将使事件处理程序等待窗口关闭,并在关闭后立即调用Shutdown


创建某些窗口实例的启动事件处理程序中存在什么问题尚不清楚。有什么想法吗?

通过这样做,您刚才创建的窗口已成为主窗口:StartupUri中指定的窗口将仅在启动事件之后创建。默认情况下,必须关闭主窗口才能关闭应用程序。由于它从未显示,用户没有机会这样做,应用程序似乎永远挂起。当执行暂停时,您看到的是一个正常的消息循环,这里没有崩溃。添加窗口。显示以查看真正的“主”窗口


如果决定手动实例化主窗口,请从App.xaml中删除StartupUri属性。或者,保留该属性并在主窗口中加载的事件触发后实例化其他窗口。

这样做,您刚才创建的窗口将成为主窗口:StartupUri中指定的窗口将仅在启动事件之后创建。默认情况下,必须关闭主窗口才能关闭应用程序。由于它从未显示,用户没有机会这样做,应用程序似乎永远挂起。当执行暂停时,您看到的是一个正常的消息循环,这里没有崩溃。添加窗口。显示以查看真正的“主”窗口


如果决定手动实例化主窗口,请从App.xaml中删除StartupUri属性。或者,在主窗口中加载的事件被触发后,保留该属性并实例化其他窗口。

我有一个解决方案,这对我来说很好。Idea类似于winforms——主要做所有事情

然而,这在wpf中有点棘手,我用这个问题作为指导:

从App.xaml中删除StartupUri; 将App.xaml属性生成操作设置为Page这听起来很奇怪,但它适用于桌面应用程序。这将从自动生成的类App.g.cs和App.g.i.cs中删除Main方法。 将主方法手动添加到应用程序中:

现在,我可以直接控制显示哪个窗口以及何时进行程序流控制,并且在创建窗口实例而不显示它们时,不关闭应用程序不会再有错误

可疑的是这个页面设置和那个事实,我并没有实例化应用程序,也并没有调用Run。我还不知道将来是否会有问题。很高兴能确切知道

可能还需要初始化应用程序以加载资源?,然后

    [STAThread]
    public static void Main()
    {
        App app = new App();
        app.InitializeComponents();

        // ... the rest
        // possibly app.MainWindow = start; or app.MainWindow = next;
        // if only 1 window, then app.Run(new MainWindow());
    }

我有解决办法,对我来说似乎很好。Idea类似于winforms——主要做所有事情

然而,这在wpf中有点棘手,我用这个问题作为指导:

从App.xaml中删除StartupUri; 将App.xaml属性生成操作设置为Page这听起来很奇怪,但它适用于桌面应用程序。这将从自动生成的类App.g.cs和App.g.i.cs中删除Main方法。 将主方法手动添加到应用程序中:

现在,我可以直接控制显示哪个窗口以及何时进行程序流控制,并且在创建窗口实例而不显示它们时,不关闭应用程序不会再有错误

可疑之处在于此页面设置和 事实上,我不实例化应用程序,也不调用Run。我还不知道将来是否会有问题。很高兴能确切知道

可能还需要初始化应用程序以加载资源?,然后

    [STAThread]
    public static void Main()
    {
        App app = new App();
        app.InitializeComponents();

        // ... the rest
        // possibly app.MainWindow = start; or app.MainWindow = next;
        // if only 1 window, then app.Run(new MainWindow());
    }

“你遇到了什么车祸?”屏幕截图补充道。你能试着重现这个问题吗?它不是一个崩溃窗口,只是堆栈跟踪。在窗口上调用Show,以便用户可以关闭它并让应用程序退出。@HansPassant,以及如何在不显示窗口的情况下修复它?我不知道您为什么要这样做。我想,再打一次电话就好了。你遇到了什么车祸?@RohitVats,屏幕截图补充道。你能试着重现这个问题吗?它不是一个崩溃窗口,只是堆栈跟踪。在窗口上调用Show,以便用户可以关闭它并让应用程序退出。@HansPassant,以及如何在不显示窗口的情况下修复它?我不知道您为什么要这样做。我想,只要再次调用Close即可。好的,我删除了StartupUri,并在创建窗口实例的那一行之后的StartupEvent中启动主窗口。当关闭主窗口时,应用程序仍然会停止。关于加载的事件,您知道在哪里可以看到事件的顺序吗?因为若我读对了的话,就是元素被渲染的时候,对我来说这听起来像是第一个计时器事件。但是,正如我所说,我根本不愿意展示这种形式。有趣的是,有没有人费心去重现这个问题?我不明白你在那场争吵之后是什么意思。您应该删除.xaml文件中的StartupUri。添加用于测试目的的显示调用以查看创建的窗口。你会注意到其中一个仍然打开。是,加载是在呈现元素时,在App.xaml文件中使用第一个解决方案,而不是不带StartupUri的启动事件。请参阅问题编辑。是的,我删除了.xaml文件中的StartupUri。是的,如果我为每个实例化的窗口添加Show,它就会工作。现在,如何使应用程序在不显示我多次提到的windows的情况下工作?关于Loaded,它具体何时触发?它是在实例化时触发还是在显示之前触发?但显示意味着显示窗口,若你们读得准确,这不是我想要的。问题仍然存在:为什么实例化窗口而不在启动事件中显示它是一个问题,以及如何解决它?这不是一个问题,这是默认行为!如果您不想因为选择隐藏所述窗口而等待关闭主窗口以关闭应用程序,请调用application.shutdown,在您认为合适的时间手动关闭。例如,当特定窗口已关闭时。实际上,在显示之前加载了触发器,所以这对您的情况不起作用。好的,我删除了StartupUri并在创建窗口实例的那一行之后的StartupEvent中启动主窗口。当关闭主窗口时,应用程序仍然会停止。关于加载的事件,您知道在哪里可以看到事件的顺序吗?因为若我读对了的话,就是元素被渲染的时候,对我来说这听起来像是第一个计时器事件。但是,正如我所说,我根本不愿意展示这种形式。有趣的是,有没有人费心去重现这个问题?我不明白你在那场争吵之后是什么意思。您应该删除.xaml文件中的StartupUri。添加用于测试目的的显示调用以查看创建的窗口。你会注意到其中一个仍然打开。是,加载是在呈现元素时,在App.xaml文件中使用第一个解决方案,而不是不带StartupUri的启动事件。请参阅问题编辑。是的,我删除了.xaml文件中的StartupUri。是的,如果我为每个实例化的窗口添加Show,它就会工作。现在,如何使应用程序在不显示我多次提到的windows的情况下工作?关于Loaded,它具体何时触发?它是在实例化时触发还是在显示之前触发?但显示意味着显示窗口,若你们读得准确,这不是我想要的。问题仍然存在:为什么实例化窗口而不在启动事件中显示它是一个问题,以及如何解决它?这不是一个问题,这是默认行为!如果您不想因为选择隐藏所述窗口而等待关闭主窗口以关闭应用程序,请调用application.shutdown,在您认为合适的时间手动关闭。例如,当特定窗口已关闭时。实际上,在显示之前加载了触发器,所以这对您的案例不起作用。
    [STAThread]
    public static void Main()
    {
        App app = new App();
        app.InitializeComponents();

        // ... the rest
        // possibly app.MainWindow = start; or app.MainWindow = next;
        // if only 1 window, then app.Run(new MainWindow());
    }