为什么自定义窗口启动时会在屏幕左上角闪一下?

使用问题 · 50 次浏览
碎片哒哟 创建于 5天19小时前

窗口位置设置为屏幕中间,有时会先在屏幕左上角闪一下窗口,再显示到屏幕中间;后续再重复运行时则不会有这个问题。

窗口位置设置为自定义位置并输入屏幕坐标,则会正常出现在对应的位置,不会闪一下。

XAML设置Visibility="Hidden",每次启动时,会闪一下窗口再隐藏。

对此我的处理方式是自定义位置设为-1000,-1000,由于是在屏幕外,所以即使闪了也看不到。

但是,为啥?


回复内容
CL 5天13小时前
#1

我对这个问题也有点模糊。

很多时候设置窗口位置是在OnLoad事件里的,感觉有时候会先显示出来再调整位置。 这可能和第一次启动的时候预编译有关系,会慢一点。

----

下面是AI的说法:

你碰到的“先闪到左上角再居中/隐藏”的现象,本质上是窗口在第一次绘制前还没来得及完成定位
WPF 默认会先让窗口有个临时位置(常见是 0,0),随后根据 WindowStartupLocationSizeToContent、布局测量结果等再调整位置/尺寸。冷启动(首次运行、JIT、加载资源)时布局更慢,于是你就看到“闪一下”。再次运行因热缓存快很多,就不明显了。把窗口先放到屏幕外当然能“遮丑”,但有副作用(多显示器/DPI 时可能仍会露出边缘、任务栏缩略图闪烁等)。

碎片哒哟 回复 CL 5天1小时前 :

感谢解答,那看来如果要真的处理这种情况,只能先设置位置在屏幕外并且hidden,窗口绘制完成后再定位到屏幕中间,最后再设置Visible,从而达成保留动效在屏幕中间弹出窗口的效果,不然只能心理上克服克服了。

碎片哒哟 最后更新于 5天1小时前
CL 回复 碎片哒哟 5天1小时前 :

还有一个方式是先设置透明度为全透明,然后加载完成后再设置成不透明。

碎片哒哟 回复 CL 5天0小时前 :

哇谢谢,这个更简单合理,我习惯性地认为修改透明度丢失动效了。

回复主贴