gpt4 book ai didi

c# - BitmapCache 导致 WPF 应用程序锁定

转载 作者:行者123 更新时间:2023-11-30 13:05:40 26 4
gpt4 key购买 nike

场景如下:

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

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

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

4: 取消那个东西

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

注意事项:

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

求助!!

最佳答案

经过艰苦的努力,一位同事终于找到了这个问题。

我们的应用程序最初显示一个登录窗口,然后关闭它,并显示一个主窗口。我们很久以前就发现,如果您这样做,WPF 会假定第一个窗口(登录窗口)是应用程序的主窗口,因此它会在关闭时关闭。

为了缓解这种情况,我们在任何其他窗口之前创建了一个假的屏幕外窗口(从未显示)。 WPF 然后假设这个假窗口是主窗口 - 它永远不会关闭,因此我们的应用程序可以按需要工作。

作为引用,假窗口如下所示:

m_mainWindow = new Window { Left = int.MaxValue, Top = int.MaxValue, Width = 1, Height = 1 };
m_mainWindow.ShowInTaskbar = false;

这一切都很好。一段时间后,另一位开发人员添加了一些代码来ShowHide 这个假窗口。

显示主窗口是导致它的原因。


这是一个完整的重现:

A:在 visual studio 中制作一个新的 WPF 应用

B:将以下代码放入 App.xaml.cs 中的 App 类中

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>
  1. 运行此程序(我在 Windows 7 上),然后按 ctrl+alt+del,或调出 UAC 提示符。

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

更新:

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

奇怪!

关于c# - BitmapCache 导致 WPF 应用程序锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3632361/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com