Я уловил это (с некоторыми усилиями), когда мое приложение 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>
Next, use the standard WPF App
class, with nothing new in the XAML, but with the following in the code behind:
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.
Бегать. (программа, не похожая на Лесную).
Это работает так, как ожидалось. Окно 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");
}
}
Когда нет постоянно открытого окна, работает только первое диалоговое окно. После этого в консоль выводятся бесчисленные сообщения "До показа" и "После показа", но новые диалоговые окна не появляются - они автоматически закрываются, как только отображаются.
Конечно, это не может быть запланированным поведением? Вы получаете тот же результат? Есть идеи, почему это происходит?
public App() { }
вызовthis.InitializeComponent();
? Поскольку его своевременная инициализация очень важна для последовательных вызовов ShowDialog() для работы... Я предполагаю, что в вашем первом ShowDialog автоматически становится основным окном в контексте приложения, а последующие вызовы ShowDialog не работают, поскольку предполагаемое MainWindow к тому времени закрывается... . - person WPF-it   schedule 04.08.2011