本文告诉大家一个 WPF 的已知问题,如果窗口在创建的时候,设置在屏幕外,那这个窗口将不会进行实际的渲染,将这个窗口从屏幕外移到屏幕内的时候,将会出现窗口内容的一次闪烁。换句话说就是存在窗口内容的重渲染

什么是窗口在屏幕外创建?简单说法就是窗口不在屏幕内,如窗口的 Top 或 Left 太大或太小等,如下面代码创建窗口,而我的屏幕没有那么大,因此窗口就显示在我的屏幕外

        private async void Button_OnClick(object sender, RoutedEventArgs e)
        {
            var window = new Window()
            {
                Background = Brushes.Gray,
                Height = 200,
                Width = 200,
                Top = 100000 // 手动高亮,我的屏幕没有那么大
            };

            window.Show();

            await Dispatcher.Yield();
            window.Top = 200;
        }

运行如上面代码,可以看到在 window.Top = 200; 调用的时候,将窗口从屏幕外移动到屏幕内时,窗口的背景从白色切换为灰色。如果你看不到,只能证明你的电脑性能太好了,换个渣设备试试

本文代码放在 github 欢迎小伙伴访问

如果你将设置窗口的位置,也就是设置 Top = 100000 // 手动高亮,我的屏幕没有那么大 放在 Show 之后的一个 Render 内,那么依然窗口闪烁

        private async void Button_OnClick(object sender, RoutedEventArgs e)
        {
            var window = new Window()
            {
                Background = Brushes.Gray,
                Height = 200,
                Width = 200,
            };

            window.Show();

            // 设置为 Render 优先级,那么用户将看到窗口显示然后消失
            //await Dispatcher.Yield(DispatcherPriority.Render);

            // 设置为 Normal 优先级,那么窗口依然没有渲染
            await Dispatcher.Yield(DispatcherPriority.Normal);

            window.Top = 100000; // 手动高亮,我的屏幕没有那么大

            await Task.Delay(TimeSpan.FromSeconds(1));
            window.Top = 200;
        }

如果放在 Render 外,此时用户就可以先看到窗口显示在屏幕上,然后窗口再消失,依然可以看到窗口闪烁。但是如果窗口能足够卡,也许此时很多设备都是看不到这个创建的窗口


本文会经常更新,请阅读原文: https://blog.lindexi.com/post/WPF-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E7%AA%97%E5%8F%A3%E5%9C%A8%E5%B1%8F%E5%B9%95%E5%A4%96%E5%88%9B%E5%BB%BA%E5%B0%86%E4%B8%8D%E4%BC%9A%E5%88%B7%E6%96%B0%E6%B8%B2%E6%9F%93.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者前往 CSDN 关注我的主页

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

以下是广告时间

推荐关注 Edi.Wang 的公众号

欢迎进入 Eleven 老师组建的 .NET 社区