Я понял это (с некоторыми усилиями), когда мое приложение 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.
Выполнить.(программа, не похожая на Forest).
Работает как положено. Окно 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");
}
}
Когда естьнет постоянно открытого окна, первое диалоговое окно работает только одно.После этого на консоль выводятся бесчисленные сообщения «До шоу» и «После шоу», но новые диалоговые окна не появляются - они закрываются автоматически, как только они отображаются.
Конечно, это не может быть намеченным поведением?Вы получаете тот же результат?Есть идеи, почему это происходит?