WPF ShowDialog在第二次调用时立即返回null

17

我认为这是WPF框架中的一个bug,不想深入探究我的程序和我所做的事情,我写了一个简单的测试应用程序来证明我的理论。

这个问题能被确认吗?在将应用程序放入运行循环之前执行一系列对话框的可能解决方法有哪些?

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;

namespace ShowDialogWindow
{
  /// <summary>
  /// Interaction logic for App.xaml
  /// </summary>
  public partial class App : Application
  {
    protected override void OnStartup(StartupEventArgs e)
    {
       Window testWindow = new Window();
       testWindow.ShowDialog();
       testWindow.Close();
       // THE CODE BELOW WILL NOT SHOW THE NEXT WINDOW
       Window testWindow2 = new Window();
       testWindow2.ShowDialog();
       testWindow2.Close();
    }
  }
}

更新:

当然,我可以更改我的设计来适应这种行为。不过我原本尝试的东西非常简单。

我从Application派生出了我的MyApplication。在Main()中,我启动了一系列的启动检查,例如许可证信息、闪屏、连接性和配置检查等。当我获得全部清除后,我调用MyApplication.Run(MyMainForm)

这个设计是基于一个正常的Windows应用程序,没有任何问题。

非常感谢您的帮助,并且我会记住,在application.Run()之前不能调用ShowDialog(),因为它只是初始化关闭。然而,我认为关闭序列应该仅在App.Run()指令之后启动。

如果我理解错了,请纠正我。

2个回答

31

这不是一个bug。 Application 的默认 ShutdownModeOnLastWindowClosed,所以一旦第一个窗口关闭,您的应用程序将开始关闭!将其更改为 OnExplicitShutdown ,它就会起作用,但您需要管理关闭过程。

我认为您可能只需要重新考虑您实际想要实现什么。为什么在应用程序启动期间显示两个连续的对话框窗口?


能否请您解释一下为什么要给我点踩呢?我的回答有哪些需要改进的地方吗?非常感谢! - Kent Boogaart

5

对于任何遇到相同问题的人,以下是解决方法:

public App()
{
    // Preserve and temporarily switch shutdown mode
    var oldShutdownMode = ShutdownMode;
    ShutdownMode = ShutdownMode.OnExplicitShutdown;

    var dialog = new Window();
    var result = dialog.ShowDialog();
    dialog = new Window();
    result = dialog.ShowDialog(); // This will show!

    // Reset shutdown mode to original value
    ShutdownMode = oldShutdownMode;    
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接