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

2024-03-24

当我的 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>

接下来,使用标准的WPFApp类,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 标头中删除对其的引用。

跑步。 (这个程序,不像森林)。

这按预期工作。 The 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");
    }

}

当没有持续打开的窗口时,第一个对话框窗口是唯一可用的。之后,无数“Before show”和“After show”消息被打印到控制台,但没有出现新的对话框窗口 -一旦显示,它们就会自动关闭。

这肯定不是预期的行为吗?你得到同样的结果吗?知道为什么会发生这种情况吗?


这是预期的行为。

  • 默认情况下,第一个打开的窗口是主窗口。
  • 默认情况下,列表中的唯一窗口成为主窗口(如果要删除其他窗口)。
  • 应用程序类设计为在不存在窗口的情况下退出 窗口列表。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当没有其他窗口打开时,System.Windows.Window.ShowDialog() 出现意外行为。知道为什么吗? 的相关文章