Problème d'animation d'un panorama au démarrage

Problème d'animation d'un panorama au démarrage

Habitué à l’animation de démarrage du panorama au lancement d’une page sur Windows Phone 7, j’ai été surpris ce matin de constater que mon dernier prototype affichait directement le panorama sans animation.

J’ai donc cherché quel était la différence entre ce projet et mes autres, en reprenant la même page, mais en l’incluant dans un autre projet, l’animation se faisait bien. Au fur et à mesure, je remarque que si j’ajoutais une BitmapImage dans les ressources de l’application, cela semblait ‘activer’ cette animation. Evidemment ceci est un effet de bord et nullement la solution à notre question, le problème est donc ailleurs.

Si vous souhaitez le  reproduire, rien de plus simple. Créez un projet de type “Windows Phone Panorama Application” avec Blend ou Visual Studio et lancez le : pas d’animations, ajoutez une ressource image bidon dans les ressources de App.xaml

<BitmapImage x:Key="Bidon" UriSource="PanoramaBackground.png"/>

L’animation s’affiche bien…

En fait, le problème est plutôt simple.

Au lancement de l’initialisation de l’application (dans la méthode App::InitializePhoneApplication), on créé une nouvelle PhoneApplicationFrame et on s’enregistre sur l’événement Navigated.

RootFrame = new PhoneApplicationFrame();
RootFrame.Navigated += CompleteInitializePhoneApplication;

Quand on reçoit l’évènement Navigated, on affecte le RootVisual au PhoneApplicationFrame que l’on vient de créer, l’écran n’affiche donc plus la splashscreen, mais notre PhoneApplicationFrame.

Revenons donc à notre problème, en réalité l’animation d’ouverture du panorama a bien eu lieu, mais elle s’est déroulée alors que le RootVisual n’était pas encore affecté à notre Frame, donc visuellement, on ne voit que l’état final, après animation. Le fait de rajouter une BitmapImage dans les ressources de l’application, rallonge légèrement le temps d’initialisation de notre page et donc, l’animation à eu lieu après l’affectation du RootVisual.

Solutions

On affiche plus tôt notre page

La première solution est donc de travailler avec l’événement Navigating et non Navigated, afin d’affecter le RootVisual à ce niveau là

private void InitializePhoneApplication()
{
if (phoneApplicationInitialized)
return;
RootFrame = new PhoneApplicationFrame();
RootFrame.Navigating += CompleteInitializePhoneApplication;
RootFrame.NavigationFailed += RootFrame_NavigationFailed;
phoneApplicationInitialized = true;
}
private void CompleteInitializePhoneApplication(object sender, NavigatingCancelEventArgs e)
{
if (RootVisual != RootFrame)
RootVisual = RootFrame;
RootFrame.Navigating -= CompleteInitializePhoneApplication;
}

Précharger vos images pour retarder le lancement

Comme on vient de le voir, ajouter des ressources dans l’application retarde légèrement l’affichage.

Prenez une de vos images (comme l’image de  fond du panorama) et mettez là dans les ressources de votre application. Remplacez ensuite la propriété Background par une référence à votre ressource, et voilà !

 

Merci à Samuel Blanchard qui m’a aidé à résoudre ce mystère

Comments are closed.