Неожиданное поведение System.Windows.Window.ShowDialog (), когда другие окна не открыты. Есть идеи почему? - PullRequest
3 голосов
/ 04 августа 2011

Я понял это (с некоторыми усилиями), когда мое приложение 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");
    }

}

Когда естьнет постоянно открытого окна, первое диалоговое окно работает только одно.После этого на консоль выводятся бесчисленные сообщения «До шоу» и «После шоу», но новые диалоговые окна не появляются - они закрываются автоматически, как только они отображаются.

Конечно, это не может быть намеченным поведением?Вы получаете тот же результат?Есть идеи, почему это происходит?

Ответы [ 2 ]

5 голосов
/ 04 августа 2011

Это предполагаемое поведение.

  • По умолчанию первым открытым окном является MainWindow.
  • По умолчанию единственным окном в списке становится MainWindow (если другие должны быть удалены).* Класс приложения предназначен для выхода, если в списке окон нет окон.

Проверьте это: http://www.ageektrapped.com/blog/the-wpf-application-class-overview-and-gotcha/

1 голос
/ 13 мая 2016

Resolve

Вы можете перейти к файлу 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.

...