当我的 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");
}
}
当没有持续打开的窗口时,第一个对话窗口是唯一有效的。之后,无数的“演出前”和“演出后”消息被打印到控制台,但没有出现新的对话框窗口——它们一显示就自动关闭。
这肯定不是预期的行为吗?你得到同样的结果吗?知道为什么会这样吗?