Várias alterações foram feitas no Windows Phone “Mango” para melhorar a performance das aplicações, grande parte delas totalmente transparente para os programadores!
Uma delas tem a ver com o carregamento de imagens no BitmapImage: por omissão, todas as imagens são carregadas apenas quando necessárias, mas esse trabalho é feito no thread principal, causando o bloqueio (ou atraso!) da aplicação até que a imagem seja completamente carregada; ou seja, se a intenção era de fazer o carregamento das imagens num thread separado para não bloquear a interface, teriamos que implementar nós mesmos essa funcionalidade!
Neste momento, existe a possibilidade de deixar que o Silverlight no Windows Phone se encarregue de carregar as imagens assincronamente em threads separados do principal, recorrendo à propriedade BitmapImage.CreateOptions.
Esta propriedade do tipo BitmapCreateOptions tem o valor por omissão de DelayCreation, que tal como indicado anteriormente, carrega a imagem apenas quando esta for realmente necessária, mas no thread principal.
A título de exemplo, sabemos que este bloco de código:
<Image Source="http://domain/image.png" />
É equivalente a este:
<Image>
<Image.Source>
<BitmapImage CreateOptions="DelayCreation" UriSource="http://domain/image.png" />
</Image.Source>
</Image>
Para forçar o carregamento assíncrono de imagens, devemos colocar neste propriedade o valor BackgroundCreation, em que o Silverlight se encarrega de criar e manter uma cache de imagens carregadas em background.
<Image>
<Image.Source>
<BitmapImage CreateOptions="BackgroundCreation" UriSource="http://domain/image.png" />
</Image.Source>
</Image>
O ideal será mesmo colocar o valor das duas propriedades, “DelayCreation,BackgroundCreation” , forçando assim o Silverlight para carregar as imagens apenas quando forem necessárias, mas sempre num thread separado!
<Image>
<Image.Source>
<BitmapImage CreateOptions="DelayCreation,BackgroundCreation" UriSource="http://domain/image.png" />
</Image.Source>
</Image>