Обновить. Я думаю, мне нужно понять, что такое "правильный", "поддерживаемый" способ показать диалог перед запуском приложения в 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
или что-то в этом роде. Я бы хотел, чтобы это было очень просто, коротко и прямолинейно - как должен выглядеть код начальной загрузки, так что он легко обнаруживает ошибки невооруженным глазом.