5

我发现了一些相当奇怪的行为......

以下是如何复制问题:

  1. 创建 WPF 应用程序项目。
  2. 从 App.xaml 文件中删除 StartupUri。
  3. 将启动事件处理程序添加到带有签名“ private void Application_Startup(object sender, StartupEventArgs e)”的应用程序
  4. 现在,向项目添加一个表单(右键单击并选择添加新项目)。
  5. 在 Application_Startup 方法中,创建表单对象并将其显示为Form1 f1 = new Form1(); f1.ShowDialog();
  6. 在实际的 Form1 上,向设计器添加一个按钮,并向该按钮添加一个单击事件处理程序。
  7. 将一个新的 WPF 窗口添加到您的项目 Window1。
  8. 在步骤 6 中创建的 Form1 的按钮单击事件处理程序中,添加创建显示 WPF 窗口的代码行:Window1 w1 = new Window1(); w1.Show();
  9. 运行项目并单击 winform 上的按钮以显示 WPF 窗口...到目前为止工作正常。
    1. 关闭 WPF 窗口并再次单击 winform 的按钮。这次你应该得到异常。

所以,基本上我所做的是创建一个显示 winform 的 WPF 应用程序。然后,winform 显示一个 WPF 窗口。

第一次显示 WPF 窗口时,一切正常。如果它被关闭,然后重新打开,我得到异常!我还可以通过多次单击该按钮来打开多个 WPF 窗口。但是,一旦最后一个关闭了,我就再也不能再打开另一个了...

我还尝试了http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/442782b1-00a1-4e2e-9cc6-ae99b6699126/建议的各种技巧,但这些都没有帮助。

为什么会这样?

4

1 回答 1

10

默认的 Wpf 应用程序关闭行为(在 VS 的项目属性中的“应用程序”选项卡上指定或使用 Application.Xaml 中的 ShutdownMode 属性指定)是“在最后一个窗口关闭时”。这意味着当您关闭您创建的 Wpf 窗口时,Wpf 会关闭应用程序框架,因此任何后续窗口创建都会引发异常。

您可以通过将关闭模式设置为“显式关闭”(Xaml 中的“OnExplicitShutdown”)来避免此问题。然后,当您希望应用程序终止时(例如,当 winforms 表单关闭时),您将需要显式手动调用 Application.Current.Shutdown。

于 2009-02-06T16:33:06.657 回答