After much hard work, a co-worker finally managed to track this down.
Our application initially shows a logon window, then closes it, and shows a main window. We discovered a long time ago that if you do this, WPF assumes that the first window (the logon window) is the application's main window, and so it shuts down when it closes.
To mitigate this, we created a fake offscreen window (which is never shown) before any other windows. WPF then assumes this fake window is the main one - it never closes, so our app can work as desired.
For reference, the fake window looks like this:
m_mainWindow = new Window { Left = int.MaxValue, Top = int.MaxValue, Width = 1, Height = 1 };
m_mainWindow.ShowInTaskbar = false;
This was all fine. Some time later, another developer added some code to Show
and Hide
this fake window.
Showing the main window was what caused it.
Here's a full repro:
A: Make a new WPF app in visual studio
B: Put the following code in your App
class in 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: Put at least one BitmapCached
element in your MainWindow.xaml
. Here's mine
<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>
- Run this program (I'm on windows 7), and then press ctrl+alt+del, or bring up a UAC prompt.
You'll see the app appear to lock up as described in the question - commenting out the m_mainWindow.Show fixes it.
Update:
Upon some further investigation it's not just showing the window, it's the fact that ShowInTaskBar
is set to false. If we don't set that, then showing the window no longer causes the issue.
Bizarre!