WPF ShowDialog возвращает null немедленно при втором вызове

Я думаю, что это ошибка в структуре 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() я инициирую серию стартовых проверок, например информацию о лицензии, заставку, проверку подключений и конфигурации, ect. Когда я все понял, я звоню MyApplicatiom.Run(MyMainForm).

Эта конструкция основана на обычном приложении Windows, которое работает без проблем.

Большое спасибо за вашу помощь, и я буду помнить, что вы не можете позвонить ShowDialog() до application.Run(), поскольку он просто инициализирует выключение. Однако я бы подумал, что последовательность отключения должна быть инициирована только после инструкции App.Run().

Пожалуйста, поправьте меня, если я понимаю это неправильно.

Ответы

Ответ 1

Не ошибка. Значение по умолчанию ShutdownMode для Application равно OnLastWindowClosed, поэтому, как только первое окно будет закрыто, ваше приложение закроется! Перейдите на OnExplicitShutdown, и он будет работать, но вам придется управлять отключением.

Я думаю, вам, вероятно, просто нужно переосмыслить то, что вы на самом деле пытаетесь достичь. Зачем вам отображать два последующих диалоговых окна во время запуска вашего приложения?

Ответ 2

Для тех, у кого есть такая же проблема, вот как вы можете обойти это:

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