当我恢复我的应用程序时,有时它会丢失图像。即使在琐碎的应用程序中,我也可以重现这一点。
这以两种不同的方式表现出来,具体取决于图像的来源:
- 如果我做了类似的事情
<Image Source="/Assets/Logo.png"/>
(即,通过 URI 从我的应用程序包中加载图像),图像将短暂消失,然后重新加载。当屏幕包含许多图像时,这更容易看到;它们按顺序重新加载,因此我可以在屏幕上看到图像加载波纹。 - 如果我创建了一个
WriteableBitmap
并将其绑定到 Image.Source,那么位图将完全消失,永远不会返回。
如果它只是重新加载图像(尽管涟漪效应令人不快),我可能会忍受这个,但我做了很多动态图像生成,而且我的所有 WriteableBitmaps 消失并不酷。
并非每次应用程序暂停和恢复时都会发生这种情况,只是有时会发生。我还没有确定一个可靠的复制案例,但似乎它被暂停的时间越长,我在此期间做的其他事情就越多(在桌面 Chrome 中浏览网页,玩 TapTiles 和 Microsoft Minesweeper 等全屏 DirectX 游戏) ,越有可能,当我切换回我的应用程序时,图像就会丢失。(应用程序不会被终止并重新启动——它仍然是同一个应用程序实例。)
我想知道这是否与从视频内存中刷新图像有关。但我不知道如何检验这个假设,所以在这一点上只是一个猜测。
到目前为止,我还没有找到任何方法让我的程序甚至告诉 WriteableBitmaps 正在丢失。事件的顺序与正常的挂起和恢复相同:
- Window.Current.Activated 使用 args.WindowActivationState == Deactivated 触发
- Window.Current.VisibilityChanged 使用 args.Visible == false 触发
- 应用程序.暂停火灾
- (时间流逝)
- 应用程序.恢复火灾
- Window.Current.VisibilityChanged 使用 args.Visible == true 触发
- Window.Current.Activated 使用 args.WindowActivationState == CodeActivated 触发
我没有任何运气找到“顺便说一句,你所有的图像都消失了”事件。WriteableBitmap没有事件。Image有 ImageOpened 和 ImageFailed 事件,但这些事件仅在我从 URI 加载图像时触发——当 Source 是 WriteableBitmap 时它们永远不会触发。
我已经能够在琐碎的应用程序中重现这一点,所以它不是由某些第三方库引起的。如果应用程序已暂停一段时间然后您恢复它,则具有通过 URI 加载的图像的空白页面将再次触发 ImageOpened(并且图像在完成重新加载之前会短暂闪烁)。如果应用程序已暂停一段时间,然后您恢复它,则带有初始化为 WriteableBitmap 的图像的空白页面将消失。
如何修复 WriteableBitmaps 的丢失(如果可能,还有 content-URI 图像)?有什么方法可以防止图像首先丢失?如果没有,有什么方法可以检测到它们已经丢失,所以我可以重新创建我的 WriteableBitmaps?
(对于奖励积分,我很想知道为什么图像会消失,但这部分完全是可选的。我早就放弃了期待 WinRT 有意义。)