Неожиданное поведение System.Windows.Window.ShowDialog(), когда другие окна не открыты. Есть идеи почему?
Я понял это (с некоторыми усилиями), когда мое приложение WPF MVVM пыталось отобразить два последовательных диалоговых окна ошибок до того, как было запущено главное окно: После нажатия первого окна приложение зашло в цикл, и второе диалоговое окно ошибок так и не появилось,
Я исправил проблему, но я надеялся, что кто-нибудь сможет объяснить мне, почему это произошло.
Кажется, что, если нет немодальных открытых окон, если одно диалоговое окно было закрыто, все новые диалоговые окна немедленно закрываются без отображения.
Его очень легко воспроизвести, поэтому здесь приведен некий тщательно продуманный код, иллюстрирующий проблему. Этот код завершен, поэтому, используя только это, вы сможете воспроизвести его.
Создайте элемент управления Window для диалогового окна без кода и только следующий XAML:
<Window x:Class="ForumExampleShowDialogIssue.OKDialogWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="OKDialogWindow" Height="300" Width="300">
<StackPanel>
<TextBlock Text="This is a Window with a single button. The button is set to Cancel, so it closes the window."
TextWrapping="Wrap"
Margin="5"/>
<Button Content="OK" IsCancel="True" IsDefault="True"
Margin="5"/>
</StackPanel>
Далее используйте стандартный WPF App
класс, с ничего нового в XAML, но со следующим в коде:
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
OKDialogWindow alwaysOpen = new OKDialogWindow();
alwaysOpen.Show();
while (true)
{
OKDialogWindow dialogWindow = new OKDialogWindow();
Console.WriteLine("Before show");
dialogWindow.ShowDialog();
Console.WriteLine("After show");
}
}
Удалите MainWindow.XAML, если он существует, и удалите ссылку на него из заголовка App.XAML.
Запустить. (программа, не похожая на лесную).
Это работает как ожидалось. alwaysOpen
окно остается открытым, пока одно за другим dialogWindow
экземпляры появляются в диалоговом режиме, закрывая при OK
щелкает, затем показывает следующий.
ОДНАКО, это ломается, когда вы меняете OnStartup
к следующему:
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
while (true)
{
OKDialogWindow dialogWindow = new OKDialogWindow();
Console.WriteLine("Before show");
dialogWindow.ShowDialog();
Console.WriteLine("After show");
}
}
Когда нет постоянно открытого окна, первое диалоговое окно является единственным, которое работает. После этого на консоль выводятся бесчисленные сообщения "До показа" и "После показа", но новые диалоговые окна не появляются - они закрываются автоматически, как только они отображаются.
Конечно, это не может быть предполагаемым поведением? Вы получаете тот же результат? Есть идеи, почему это происходит?
2 ответа
Это предполагаемое поведение.
- По умолчанию первое открытое окно - MainWindow.
- По умолчанию единственным окном в списке становится MainWindow (если нужно удалить другие).
- Класс приложения предназначен для выхода, если в списке окон нет окон.
Проверьте это: http://www.ageektrapped.com/blog/the-wpf-application-class-overview-and-gotcha/
Разрешить
Вы можете перейти к App.xaml
файл и добавить это в корень <Application>
узел:
ShutdownMode="OnExplicitShutdown"
Это означает, что даже когда вы закроете все окна, приложение будет работать до тех пор, пока вы явно не вызовете InvokeShutdown()
Метод. Значение по умолчанию ShutdownMode
является OnMainWindowClose
,
объяснение
В своем первом фрагменте вы сначала создаете окно, которое никогда не закрывается. Это MainWindow
и это никогда не закрывается. таким образом Application
никогда не выключайся. Но в вашем втором фрагменте, ваш MainWindow
это первый диалог, который вы создали. Приложение закроется, как только окно закроется. Ваши другие диалоги никогда не будут отображаться после Application
закрыли, верно?
См. MSDN: https://msdn.microsoft.com/en-us/library/system.windows.application.shutdownmode(v=vs.110).aspx.