我该如何创建一个没有白色闪光灯的具有自定义背景颜色的WPF窗口



使用Windows 11和WPF,当我更改窗口的背景色时,窗口会闪烁白色,然后在几帧后显示程序的正确颜色。这真的很烦人,因为我正在做的程序很小,而且有黑暗模式。查看互联网,没有太多结果,但";解决方案";通常包括最初最小化窗口,然后在加载所有内容时显示它。这很好,但在Windows 11上,它会产生一个非常分散注意力的"问题";显示";动画,它更像是一个闪光,而不是一个解决方案。有些人推荐了一个启动屏幕,但这应该没有必要,因为我正在开发的程序非常简单。

这有可能是:

  1. 驱动程序/图形问题
  2. 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配置为使用系统颜色时,系统颜色为深色

为了解决这个问题,我不得不做以下事情:

  1. 设置启动屏幕。(是的,我知道,这个问题的作者不想要一个启动屏幕,但很多人会看到这个问题,他们不介意有一个。(启动屏幕可以是一个完全透明的PNG文件,这与没有启动屏幕几乎没有区别。

  2. 在app.manifest中将dpiAware设置为true

  3. 从主窗口中删除任何实际功能,这样它的加载就不会因为任何事情而减慢。这意味着:

    • MainWindow的所有内容移动到一个名为MainView的新类中
    • 使MainWindow包含初始为空的MainView
    • MainWindowViewModel的所有功能移到新的类MainViewModel
    • MainWindowViewModel在第一个空闲事件上实例化MainViewModel。(此时还要在MainWindow内部创建MainView,以便呈现MainViewModel。(

请注意,仅执行上述3个步骤中的1个或2个步骤对我不起作用所有3个步骤都是必要的(我知道,这很荒谬,但事实就是如此。欢迎来到Windows,荒谬是当今的主流。(

另请注意:

  • 从应用程序的构造函数调用user32.dll:SetProcessDPIAware()没有效果。

  • 摆弄";目标操作系统版本";以及";支持的操作系统版本";在Project Properties中没有任何影响。

最新更新