不管你做的 WPF 窗口做得多么简单,是否总感觉启动的那一瞬间窗口内是白白的一片?是否试过无数偏方黑科技,但始终无法解决?

本文将介绍一种简单的方法来彻底解决这个问题。


看看下面这张图,你便能知道本文要解决的问题是否跟你希望解决的是同一个问题:

启动期间显示白色

是否发现窗口启动期间,窗口中的内容是白色的呢?

然而我的 Window 超级简单:

<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 的已知 BUG(this is a known issue in WPF)
  • 可以先设置窗口 WindowState="Minimized",然后等 LoadedContentRendered 之后再设回 Normal/Maximized

经过多次尝试,甚至都改掉了 WindowTemplate 都无法解决这个问题。

<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 附加属性:

<WindowChrome.WindowChrome>
    <WindowChrome/>
</WindowChrome.WindowChrome>

无需额外设置任何值,即可修复此问题(不过此时在 Visual Studio 中调试可能发现启动动画丢失)。

但是,由于此时开始能够在非客户区(NonClientArea)显示控件了,所以可能需要自己调整一下视觉效果。

<WindowChrome.WindowChrome>
    <WindowChrome GlassFrameThickness="0 31 0 0" CornerRadius="0" UseAeroCaptionButtons="True"/>
</WindowChrome.WindowChrome>

本文会经常更新,请阅读原文: https://walterlv.github.io/post/fix-white-screen-when-wpf-window-launching.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://walterlv.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系