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