当我的 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”消息被打印到控制台,但没有出现新的对话框窗口 -一旦显示,它们就会自动关闭。
这肯定不是预期的行为吗?你得到同样的结果吗?知道为什么会发生这种情况吗?