修复 WPF 窗口在启动期间短暂的白底显示

修复 WPF 窗口在启动期间短暂的白底显示

2017-11-03 15:08

不管你做的 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.com/post/fix-white-screen-when-wpf-window-launching.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏DeveWork

Google Fonts导致WordPress 速度问题的三个解决方案

本来实在是不想写这个的,因为相关方法在圈子里面已经烂大街了。但无奈,一些客户将近期的Google Fonts导致 WordPress 打开速度慢的现象归咎于我的...

3089
来自专栏求索之路

教你用android玩冲顶大会——实现几个小时的财务自由

最近答题类app比较火,玩了几把之后想到为什么不用技术来查找答案呢?因此搞了一款辅助app,能够帮助大家直接搜索答案.经过两天的开发和三天的测试,终于让我的冲...

3176
来自专栏开源项目

精选 6 款程序员自己开发的文本编辑器 | 码云周刊第 51 期

相信很多小伙伴在编辑文本都会使用 Windows 自带的记事本,但是记事本由于功能所限,无法满足办公需要,下面推荐 6 款我们“程序猿”自己做的文本编辑器,普通...

4086
来自专栏Web 开发

Android上的Web应用开发工具

最后,因为我的手机是带全键盘的,并且是5行,独立数字键,所以,用来敲代码很爽,尤其是平时上课的时候,想到的一些片段,用来记录不错~

1160
来自专栏肖洒的博客

jeklly+Github pages 添加评论

之前的个人博客主要是fork了其他人的源码。基于Jekyll+Github pages。在此基础上改了一些东西,适合自己的才是最好的嘛。最后才准备做评论这方面的...

671
来自专栏编程微刊

【干货】前端开发者最常用的六款IDE

4625
来自专栏假装我会写代码

也来扯扯 Vue 单元测试

2763
来自专栏开源项目

Git 项目推荐 | 基于 C# 的极速 WEB + ORM 框架

NFine 是基于 C# 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展,让Web开发更迅速、简单...

5418
来自专栏hbbliyong

Python GUI

Flexx 是一个纯Python工具包,用来创建图形化界面应用程序。其使用 Web 技术进行界面的渲染。你可以用Flexx来创建桌面应用,同时也可以导出一个应用...

2103
来自专栏施炯的IoT开发专栏

课程上线 -“新手入门 : Windows Phone 8.1 开发”

经过近1个月的准备和录制,“新手入门 : Windows Phone 8.1 开发”系列课程已经在Microsoft 虚拟学院上线,链接地址为:http://w...

1818

扫码关注云+社区

领取腾讯云代金券