BitmapCache 导致 WPF 应用程序锁定

Ori*_*rds 5 c# wpf

这是场景:

1:我们的WPF应用程序启动

2:WPF 应用程序加载各种用户控件,包括一些使用BitmapCacheWPF 4 中新功能的控件

3:点击 ctrl-alt-delete 或 win+l 或加载另一个需要 UAC 的应用程序

4:取消那个东西

WPF 应用程序现在没有响应,但问题出在 WPF 本身。所有后台线程上的所有应用程序逻辑都很好,您可以通过按 alt+f4 等与其交互,但屏幕永远不会重绘

注意事项:

  • 如果此时进入调试器,则没有用户代码在运行,这都是 WPF
  • 杀死 DWM.exe 使应用程序恢复活力
  • 如果我们取出BitmapCached 元素,它就不会锁定
  • 我制作了另一个使用 BitmapCache 的简单示例应用程序,它没有出现问题。

帮助!!

Ori*_*rds 2

经过一番努力,一位同事终于查到了这一点。

我们的应用程序最初显示一个登录窗口,然后关闭它,并显示一个主窗口。我们很久以前就发现,如果执行此操作,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)
  1. 运行这个程序(我在Windows 7上),然后按ctrl+alt+del,或者调出UAC提示。

您会看到应用程序似乎如问题中所述锁定 - 注释掉 m_mainWindow.Show 可以修复它。

更新:

经过进一步调查,它不仅仅是显示窗口,而是被设置为 false 的事实ShowInTaskBar。如果我们不设置它,那么显示窗口将不再导致问题。

奇怪!