使用Windows 11和WPF,当我更改窗口的背景色时,窗口会闪烁白色,然后在几帧后显示程序的正确颜色。这真的很烦人,因为我正在做的程序很小,而且有黑暗模式。查看互联网,没有太多结果,但";解决方案";通常包括最初最小化窗口,然后在加载所有内容时显示它。这很好,但在Windows 11上,它会产生一个非常分散注意力的"问题";显示";动画,它更像是一个闪光,而不是一个解决方案。有些人推荐了一个启动屏幕,但这应该没有必要,因为我正在开发的程序非常简单。
这有可能是:
- 驱动程序/图形问题
- WPF本身的错误
复制步骤:
dotnet new wpf
为窗口添加背景属性(我曾尝试在C#中将背景设置为window而不是XAML,并将其设置为布局,两者都没有区别(,并将它设置为颜色
dotnet build
并运行程序。
此处与Microsoft讨论过:https://social.msdn.microsoft.com/Forums/vstudio/en-US/bdb414fe-9abb-408c-8935-486e1795755b/wpf-window-with-black-background-flashes-white-when-first-shown?forum=wpf
微软方面的回答是;这是一个已知的问题";并且";他们会认真考虑到这一点;并提供";以供参考";Stack Overflow上的一些问答链接,这是关于一些基本上不相关的问题,它收到了完全不相关的答案。
无论如何,那是在2010年,所以不要为微软的任何解决方案屏住呼吸。
我也有同样的问题,将WPF与一起使用。NET 7.0;7.0〃;,在Windows 10下运行。我在许多流行的应用程序中也看到了这个问题,例如:
- 任何基于铬的web浏览器
- TortoiseGit配置为使用系统颜色时,系统颜色为深色
为了解决这个问题,我不得不做以下事情:
-
设置启动屏幕。(是的,我知道,这个问题的作者不想要一个启动屏幕,但很多人会看到这个问题,他们不介意有一个。(启动屏幕可以是一个完全透明的PNG文件,这与没有启动屏幕几乎没有区别。
-
在app.manifest中将
dpiAware
设置为true
-
从主窗口中删除任何实际功能,这样它的加载就不会因为任何事情而减慢。这意味着:
- 将
MainWindow
的所有内容移动到一个名为MainView
的新类中 - 使
MainWindow
包含初始为空的MainView
- 将
MainWindowViewModel
的所有功能移到新的类MainViewModel
中 - 让
MainWindowViewModel
在第一个空闲事件上实例化MainViewModel
。(此时还要在MainWindow
内部创建MainView
,以便呈现MainViewModel
。(
- 将
请注意,仅执行上述3个步骤中的1个或2个步骤对我不起作用所有3个步骤都是必要的(我知道,这很荒谬,但事实就是如此。欢迎来到Windows,荒谬是当今的主流。(
另请注意:
-
从应用程序的构造函数调用
user32.dll
:SetProcessDPIAware()
没有效果。 -
摆弄";目标操作系统版本";以及";支持的操作系统版本";在Project Properties中没有任何影响。