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

时间:2009-08-07 09:30:53

标签: wpf null return showdialog

我认为这是WPF框架中的一个错误,没有进入我的程序的深度,为什么我正在做我正在做的事情,我写了一个简单的测试应用程序来证明我的理论。

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

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();
    }
  }
}

更新

当然,我可以改变我的设计以适应这种行为。我试图做的事情非常简单。

我从MyApplication派生了Application。在Main()上,我启动了一系列启动检查,例如,许可证信息,启动屏幕,连接和配置检查等。当我清楚地说清楚时,我会打电话给MyApplicatiom.Run(MyMainForm)

此设计基于正常的Windows应用程序,可以顺利运行。

非常感谢您的帮助,我会记住您无法在ShowDialog()之前致电application.Run(),因为它只是无法关闭。不过我会想到只能在App.Run()指令之后启动关机序列。

如果我理解这个错误,请纠正我。

2 个答案:

答案 0 :(得分:27)

不是错误。 ShutdownMode的默认ApplicationOnLastWindowClosed,因此只要第一个窗口关闭,您的应用就会开始关闭!更改为OnExplicitShutdown,它会起作用,但您必须管理关机。

我想你可能只需要重新思考你实际想要实现的目标。为什么在启动应用程序期间会显示两个后续对话框窗口?

答案 1 :(得分:4)

对于有同样问题的人,以下是解决问题的方法:

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;    
}