不管你做的 WPF 窗口做得多么简单,是否总感觉启动的那一瞬间窗口内是白白的一片?是否试过无数偏方黑科技,但始终无法解决?
本文将介绍一种简单的方法来彻底解决这个问题。
看看下面这张图,你便能知道本文要解决的问题是否跟你希望解决的是同一个问题:
是否发现窗口启动期间,窗口中的内容是白色的呢?
然而我的 Window
超级简单:
1
2
3
4
5
6
7
8
9
10
11
12
<Window x:Class="Walterlv.Demo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Walterlv.Demo"
mc:Ignorable="d" Title="星i">
<Border Background="Teal">
<TextBlock Text="walterlv's demo" Foreground="White" FontSize="24" FontWeight="Thin"
TextAlignment="Center" VerticalAlignment="Center"></TextBlock>
</Border>
</Window>
这个问题在网上 Google 搜索结果上已发现有很多讨论:
- WPF Window with black background flashes white when first shown
- White screen before loading main window contents
- How can I avoid flicker in a WPF fullscreen app?
然而基本上观点都是相似的:
- 这是 WPF 的已知 BUG(this is a known issue in WPF)
- 可以先设置窗口
WindowState="Minimized"
,然后等Loaded
或ContentRendered
之后再设回Normal
/Maximized
。
经过多次尝试,甚至都改掉了 Window
的 Template
都无法解决这个问题。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<Window x:Class="Walterlv.Demo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Walterlv.Demo"
mc:Ignorable="d" Title="星i">
<Window.Template>
<ControlTemplate TargetType="Window">
<ContentPresenter/>
</ControlTemplate>
</Window.Template>
<Border Background="Teal">
<TextBlock Text="walterlv's demo" Foreground="White" FontSize="24" FontWeight="Thin"
TextAlignment="Center" VerticalAlignment="Center"></TextBlock>
</Border>
</Window>
但是!!!发现使用 WindowChrome
定制窗口非客户区的时候,此问题就不再出现了!!!
也就是说,此问题在微软彻底解决之前,也是有规避方案的!——那就是 WindowChrome
!
这是效果:
做法就是给 Window
设置 WindowChrome
附加属性:
1
2
3
<WindowChrome.WindowChrome>
<WindowChrome/>
</WindowChrome.WindowChrome>
无需额外设置任何值,即可修复此问题(不过此时在 Visual Studio 中调试可能发现启动动画丢失)。
但是,由于此时开始能够在非客户区(NonClientArea)显示控件了,所以可能需要自己调整一下视觉效果。
1
2
3
<WindowChrome.WindowChrome>
<WindowChrome GlassFrameThickness="0 31 0 0" CornerRadius="0" UseAeroCaptionButtons="True"/>
</WindowChrome.WindowChrome>
本文会经常更新,请阅读原文: https://blog.walterlv.com/post/fix-white-screen-when-wpf-window-launching.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 ([email protected]) 。