【发布时间】:2014-03-17 16:38:43
【问题描述】:
它说,我可以将Startup 事件用于很多事情,比如初始化、创建多个表单、blablabla。
但是,尝试创建一个新的 WPF 应用程序并添加此事件处理程序:
private void App_Startup(object sender, StartupEventArgs e)
{
Window window = new Window();
}
关闭主窗口后,您的应用程序将在内存中挂起。在那一刻暂停在 VS 中执行将丢弃丑陋的 crash 调用堆栈窗口,其中有很多调用远离我的源代码。
有什么想法吗?
P.S.:我需要为自学配置目的实例化我的所有窗口一次。我应该使用其他地方吗?
让我举一个更好的例子(上面的例子很好地重现了这个问题,似乎很难理解我实际上在做什么)。我删除 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 在创建多个窗口时似乎存在一些问题,但不显示它们。问题是为什么以及如何解决它。
测试更多。试试这段代码并解释一下,为什么关闭应用程序而不显示 any 窗口?
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 事件处理程序在创建某些窗口的实例时有什么问题。有什么想法吗?
【问题讨论】:
-
你遇到了什么崩溃?
-
@RohitVats,添加了屏幕截图。你能尝试重现这个问题吗?
-
这不是崩溃窗口,只是堆栈跟踪。在窗口上调用 Show() 以便用户可以关闭它并让应用退出。
-
@HansPassant,不显示窗口如何解决?
-
我不知道你为什么要这样做。我猜只是再次调用 Close()。