WPF ShowDialog немедленно возвращает ноль при втором вызове - PullRequest
15 голосов
/ 07 августа 2009

Я думаю, что это ошибка в структуре 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 ]

27 голосов
/ 07 августа 2009

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

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

4 голосов
/ 15 апреля 2014

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

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