场景如下:
1:我们的 WPF 应用程序启动
2:WPF 应用程序加载各种用户控件,包括一些使用 WPF 4 中新的
BitmapCache
功能的控件
3:点击 ctrl-alt-delete 或 win+l 或加载另一个需要 UAC 的应用程序
4:取消那个东西
WPF 应用程序现在没有响应,但问题出在 WPF 本身。所有后台线程上的所有应用程序逻辑都很好,您可以通过按 alt+f4 等与其交互,但是屏幕永远不会重绘
注意事项:
BitmapCache
d 元素,它就不会锁定救命!!
经过一番努力,一位同事终于查到了这一点。
我们的应用程序最初显示一个登录窗口,然后关闭它,并显示一个主窗口。我们很久以前就发现,如果您这样做,WPF 会假定第一个窗口(登录窗口)是应用程序的主窗口,因此它会在关闭时关闭。
为了缓解这种情况,我们在任何其他窗口之前创建了一个假的离屏窗口(从未显示)。然后,WPF 假设这个假窗口是主窗口 - 它永远不会关闭,因此我们的应用程序可以按需要工作。
供参考,假窗口如下所示:
m_mainWindow = new Window { Left = int.MaxValue, Top = int.MaxValue, Width = 1, Height = 1 };
m_mainWindow.ShowInTaskbar = false;
一切都很好。一段时间后,另一位开发人员向
Show
和 Hide
这个假窗口添加了一些代码。
显示主窗口是导致此问题的原因。
这是完整的重现:
A:在 Visual Studio 中制作一个新的 WPF 应用程序
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>
您会看到应用程序似乎如问题中所述锁定 - 注释掉 m_mainWindow.Show 可以修复它。
经过进一步调查,它不只是显示窗口,而是ShowInTaskBar
设置为 false。如果我们不设置它,那么显示窗口将不再导致问题。奇怪!
:)
BitmapCache
的更新
BitmapCache
分配给第一个窗口,问题就会消失