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