Por que minhas imagens às vezes são recarregadas (e os WriteableBitmaps desaparecem) no currículo?

Quando retomo meu aplicativo, às vezes ele perde suas imagens. Eu posso reproduzir isso mesmo em aplicativos triviais.

Isso se manifesta de duas maneiras diferentes, dependendo de onde a imagem veio:

Se eu fiz algo parecido<Image Source="/Assets/Logo.png"/> (isto é, carregando uma imagem do pacote do meu aplicativo por URI), a imagem desaparecerá rapidamente e, em seguida, será recarregada. Isso é mais fácil de ver quando a tela contém muitas imagens; eles recarregam em sequência, para que eu possa ver a ondulação de carregamento da imagem na tela.Se eu criei umWriteableBitmap e ligá-lo a Image.Source, o bitmap desaparece completamente, nunca para retornar.

Eu provavelmente poderia viver com isso se estivesse apenas recarregando imagens (embora o efeito cascata seja desagradável), mas eu faço um pouco de geração dinâmica de imagens, e não é legal que todos os meus WriteableBitmaps desapareçam.

Isso não acontece toda vez que o aplicativo é suspenso e recomeça, apenas às vezes. Eu não consegui encontrar um caso confiável de repro, mas parece que quanto mais tempo ele é suspenso, e mais outras coisas que estou fazendo nesse ínterim (navegando na web no Chrome, jogando jogos em DirectX em tela cheia como TapTiles e Microsoft Minesweeper) , é mais provável que, quando eu voltar ao meu aplicativo, as imagens sejam perdidas. (O aplicativo énão sendo finalizado e relançado - ainda é a mesma instância do aplicativo.)

Eu me pergunto se é algo a ver com imagens sendo liberadas da memória de vídeo. Mas eu não tenho idéia de como testar essa hipótese, então neste momento é apenas um palpite.

Até agora, não encontrei nenhuma maneira do meu programa dizer que os WriteableBitmaps estão sendo perdidos. A sequência de eventos é idêntica a uma suspensão normal e retomada:

Window.Current.Activated é acionado com args.WindowActivationState == DesativadoWindow.Current.VisibilityChanged é acionado com args.Visible == falseApplication.Suspending fires(o tempo passa)Aplicação de incêndiosWindow.Current.VisibilityChanged é acionado com args.Visible == trueWindow.Current.Activated é acionado com args.WindowActivationState == CodeActivated

Eu não tive a sorte de encontrar um evento "e, a propósito, todas as suas imagens foram embora".WriteableBitmap não tem eventos.Imagem tem eventos ImageOpened e ImageFailed, mas esses são acionados somente quando eu carrego uma imagem de um URI - eles nunca são disparados quando Source é um WriteableBitmap.

Eu consegui reproduzir isso em aplicativos triviais, por isso não é causado por alguma biblioteca de terceiros. Uma página em branco com uma imagem carregada pelo URI irá disparar o ImageOpened novamente (e a imagem piscará brevemente antes de terminar de recarregar) se o aplicativo tiver sido suspenso por algum tempo e depois você reiniciá-lo. Uma página em branco com uma imagem inicializada em um WriteableBitmap desaparecerá se o aplicativo tiver sido suspenso por algum tempo e você o retomar.

Como posso corrigir a perda de WriteableBitmaps (e, se possível, imagens de URI de conteúdo também)? Existe alguma maneira que eu possa impedir que as imagens se percam em primeiro lugar? Se não, há alguma maneira de detectar que eles foram perdidos, para que eu possa recriar meus WriteableBitmaps?

(Para pontos de bônus, eu adoraria saberporque as imagens desaparecem, mas essa parte é totalmente opcional. Há muito que desisti de esperar que o WinRT fizesse sentido.)

questionAnswers(2)

yourAnswerToTheQuestion