После большой кропотливой работы коллеге наконец удалось отследить это.
Наше приложение сначала показывает окно входа в систему, затем закрывает его и показывает главное окно.Мы давно обнаружили, что если вы сделаете это, WPF предполагает, что первое окно (окно входа в систему) является главным окном приложения, и поэтому оно закрывается при закрытии.
Чтобы смягчить это, мы создалиподдельное закадровое окно (которое никогда не отображается) перед любыми другими окнами.Затем WPF предполагает, что это фальшивое окно является основным - оно никогда не закрывается, поэтому наше приложение может работать как нужно.
Для справки, фальшивое окно выглядит так:
m_mainWindow = new Window { Left = int.MaxValue, Top = int.MaxValue, Width = 1, Height = 1 };
m_mainWindow.ShowInTaskbar = false;
Это быловсе хорошо.Некоторое время спустя другой разработчик добавил код к Show
и Hide
этому фальшивому окну.
Показано главное окно, вызвавшее его.
Вот полное изображение:
A: Создайте новое приложение WPF в Visual Studio.
B: Добавьте следующий код в ваш класс App
в App.xaml.cs
public partial class App : Application
{
Window m_mainWindow;
public App()
{
m_mainWindow = new Window { Left = int.MaxValue, Top = int.MaxValue, Width = 1, Height = 1 };
m_mainWindow.ShowInTaskbar = false;
// Comment this line out and the problem goes away
m_mainWindow.Show();
}
}
C: Положитехотя бы один элемент BitmapCached
в вашем MainWindow.xaml
.Вот мой
<Window x:Class="LockupRepro.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid CacheMode="BitmapCache">
<Button Content="Look a button" />
</Grid>
</Window>
Запустите эту программу (у меня Windows 7), а затем нажмите Ctrl + Alt + Del или вызовите приглашение UAC.
Вы увидите, что приложение заблокированокак описано в вопросе - комментирование m_mainWindow.Show исправляет его.
Обновление:
После дальнейшего изучения это не просто , показывающее окно, это факт, чтоShowInTaskBar
имеет значение false.Если мы не установим это, то отображение окна больше не вызывает проблему.
Bizarre!