Обновление : Полагаю, мне нужно понять, каков "правильный", "поддерживаемый" способ отображения диалога перед запуском приложения в WPF.
Вот код:
public partial class App : Application
{
[STAThread]
public static void Main()
{
var app = new App();
app.InitializeComponent();
new DialogWindow().ShowDialog();
app.Run( new MainWindow() );
}
}
DialogWindow
отображается как ожидалось.
Но после его закрытия приложение закрывается немедленно. MainWindow
вообще не появляется!
Я провел некоторую отладку и отследил проблему до следующего:
- Когда диалоговое окно создано, оно становится
app
MainWindow, поскольку в данный момент MainWindow отсутствует.
- Поэтому закрытие диалогового окна приводит к тому, что приложение отправляет
ShutdownCallback
в очередь диспетчера.
- Однако диспетчер не запускается достаточно долго для выполнения обратного вызова.
- Поэтому, если впоследствии вызывается
app.Run
, первым в очереди будет ShutdownCallback
, что, естественно, приводит к немедленному закрытию приложения.
Учитывая этот анализ, существует очевидный обходной путь: создайте MainWindow
сразу после App
, что делает его app
MainWindow, что предотвратит DialogWindow
закрытие приложения.
Однако , вот что меня беспокоит.
Во-первых, это выглядит как грязный хак для меня. Я имею в виду, что нет явной причины для создания окон в этом порядке, и я нашел это только путем некоторой отладки. Это не может быть поддерживаемым способом.
Во-вторых, это явно ошибка. Я имею в виду, что если создание второго окна после завершения работы не поддерживалось явно, оно должно было выдать InvalidOperationException
, верно?
В-третьих, это не только ошибка, но и очень наивная, что-то похожее на многопоточность.
Все это заставляет меня поверить , что, может быть, у меня здесь нет ничего фундаментального? Может быть, я не имею смысла вообще? Может быть, все это должно быть сделано по-другому?
Вот немного фона:
Приложение должно выполнить некоторую загрузку при запуске. Проверьте это и то, настройте обработчики исключений, ведение журнала - вы знаете, обычные вещи. В этом процессе может возникнуть необходимость обратиться к пользователю за помощью - для этого и нужен диалог.
Я абсолютно не хочу помещать все это в какой-то конечный автомат, который выполняется на MainWindow.IsVisibleChanged
или что-то в этом роде. Мне бы хотелось, чтобы это было действительно просто, кратко и просто - так, как должен быть представлен код начальной загрузки, чтобы легко было обнаружить ошибки невооруженным глазом.