3

当我的 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 标头中删除对它的引用。

跑。(程序,不像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");
    }

}

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

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

4

2 回答 2

5

这是预期的行为。

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

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

于 2011-08-04T17:28:44.787 回答
1

解决

您可以转到该App.xaml文件并将其添加到<Application>根节点中:

ShutdownMode="OnExplicitShutdown"

这意味着即使您关闭所有窗口,应用程序仍会运行,直到您显式调用该InvokeShutdown()方法。ShutdownMode的默认值为OnMainWindowClose。</p>

解释

在您的第一个代码段中,您首先创建一个永远不会关闭的窗口。这是MainWindow并且它永远不会关闭。因此Application永远不会关机。但是在您的第二个片段中,您MainWindow是您创建的第一个对话框。应用程序将在窗口关闭后立即关闭。关闭后您的其他对话框将永远不会显示Application,对吗?

请参阅 MSDN:https ://msdn.microsoft.com/en-us/library/system.windows.application.shutdownmode(v=vs.110).aspx 。

于 2016-05-13T12:17:12.917 回答