本文告诉大家一个 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://dotnet-campus.github.io//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 ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 lindexi (包含链接: https://dotnet-campus.github.io/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。