没有其他窗口打开时System.Windows.Window.ShowDialog()的意外行为.知道为什么吗?

Pie*_*ler 3 wpf dialog window modal-dialog 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>
Run Code Online (Sandbox Code Playgroud)

接下来,使用标准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");
    }
}
Run Code Online (Sandbox Code Playgroud)

删除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");
    }

}
Run Code Online (Sandbox Code Playgroud)

当没有不断打开的窗口时,第一个对话窗口是唯一有效的窗口.之后,无数的"Before show"和"After show"消息被打印到控制台,但没有出现新的对话窗口 - 它们会在显示后立即自动关闭.

当然这不是预期的行为?你得到相同的结果吗?知道为什么会这样吗?

lox*_*xxy 5

这是预期的行为.

  • 默认情况下,第一个打开的窗口是MainWindow.
  • 默认情况下,列表中唯一的窗口将成为MainWindow(如果要删除其他窗口).
  • 如果Windows列表中没有窗口,则应用程序类旨在退出.

检查一下:http: //www.ageektrapped.com/blog/the-wpf-application-class-overview-and-gotcha/