c# - Application.Startup 事件限制(错误?)

标签 c# wpf window

它说,我可以使用 Startup许多事情的事件,比如初始化、创建多个表单、blablabla。

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

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

关闭主窗口后,您的应用程序将在内存中挂起。在那一刻在 VS 中暂停执行将丢弃难看的 crash 调用堆栈窗口,其中有很多调用远离我的源代码。

有什么想法吗?

P.S.:为了自学配置目的,我需要实例化我所有的窗口一次。我应该使用其他地方吗?

Call stack


让我举一个更好的例子(上面的例子很好地重现了问题,似乎很难理解我实际上在做什么)。我删除 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();
    }

为什么我需要窗口实例(window1、..2、..3、...)?因为将检查它们的内容以创建我要为其保存配置的控件列表。其中一些窗口将永远显示给用户(例如,如果他不是管理员),其中一些是弹出窗口,一些是编辑器等。所以我不想显示它们。但是在任何应用程序启动时,都必须创建并保存配置。我现在正在寻找这样做的地方。

令人惊讶的是,使用专用事件 Startup 似乎在创建多个窗口但不显示 时出现一些问题。问题是为什么以及如何解决。


再测试一下。试试这段代码并向我解释一下,为什么应用程序在不显示任何窗口的情况下关闭?

    private void App_Startup(object sender, StartupEventArgs e)
    {
        Window window = new Window();
        window.Close(); // closing without opening window

        MainWindow mainWindow = new MainWindow();
        mainWindow.Show();
        //mainWindow = new MainWindow(); // can be un-commented, for absolutely no effect
        mainWindow.Show();
        mainWindow.Show();
        mainWindow.Show();
        mainWindow.Show(); // you will not see mainWindow at all, all Show doing nothing
    }

更多问题。我该怎么办?


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

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

        MainWindow mainWindow = new MainWindow();
        mainWindow.ShowDialog();
        Shutdown();
    }

注意,调用 ShowDialog(这将使事件处理程序等待该窗口关闭)并在之后立即调用 Shutdown

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

最佳答案

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

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

关于c# - Application.Startup 事件限制(错误?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22460116/

相关文章:

c# - 在 App.xaml.cs 的 OnStartup 中关闭第一个窗口后打开 C# WPF 第二个窗口

c# - 繁重的 TPL 后台线程在 WPF 的 UI 线程中产生滞后

reactjs - 用柏树在窗口上设置一个属性

javascript - 避免重复的浏览器选项卡或窗口(window.open())

c# - 对于单行 if block ,使用大括号还是不使用大括号更好?

c# - 是否可以使用简写条件运算符抛出异常? C#

C# WPF 拖动以重新排序 ListView

c# - 输入为空时格式化时间格式的字符串

c# - 绑定(bind) AvalonDock LayoutAnchorable IsVisible 属性

c++ - 如何在 C++ 中将窗口的屏幕截图作为位图对象?