[WPF] SplashScreen pour WPF en .NET 3.5 sp1
Le démarrage des applications .NET et notamment WPF surtout à froid peut parfois être un problème car il peut prendre un certain temps. De nombreuses applications utilisent aussi le démarrage de l'application pour faire une partie des initialisations du programme, ce qui n'améliore bien évidement pas le temps de démarrage. L'idée classique est donc d'utiliser un SplashScreen qui va s'afficher très vite et qui va afficher une image qui aidera l'utilisateur à patienter.
Faire cela n'est généralement pas si simple, mais heureusement le SP1 de .NET 3.5 nous apporte une nouvelle classe SplashScreen.
Mise en place via VS 2008 SP1
Pour en profiter rapidement, il suffit de créer un .PNG avec l'image que l'on veut voir afficher au démarrage et de l'inclure dans le projet de votre application WPF. Ensuite, dans la fenêtre de propriété, il suffit de mettre la Build Action à Splash Screen.
Et c'est tout! Lancer l'application, et on voit l'image s'afficher.
La 1ère impression est que ça marche bien et que le splashscreen s'ouvre et se ferme automatiquement sans rien faire. Mais on voit aussi que la fenêtre de l'application passe devant quand elle s'ouvre et que le splashscreen repasse devant pour se fermer. Pas terrible donc...
Mise en place à la main
La méthode via VS 2008 SP1 est très simple et fonctionne imédiatement, mais le résultat n'est pas complètement optimal. Heureusement, on peut aussi le faire à la main.
Pour cela il faut toujours ajouter le .PNG au projet, mais cette fois il faut le mettre en tant que Resource. Et il faut un peu modifier le App.xaml et le App.xaml.cs.
Dans le App.xaml il faut enlever l'attribut StartUpUri car on va afficher nous-mêmes la fenêtre principale.
Dans le App.xaml.cs on rajoute le code suivant:
public App()
{
var splashScreen = new SplashScreen("SplashScreen.png");
splashScreen.Show(false); InitializeComponent();
var mainWindow = new Window1();
mainWindow.Show();
splashScreen.Close(TimeSpan.Zero);
}
On crée l'objet SplashScreen avec le nom du .PNG et on fait Show. Le paramètre false signifie que l'on va fermer le splashscreen nous-mêmes. Si on le met à true, il va se fermer de lui-même à la fin du constructeur de App.
Ensuite, on crée la fenêtre principale et on la montre.
Et finalement on ferme le splashscreen avec Close et un timeSpan à zéro, ce qui permet d'avoir une fermeture immédiate et d'éviter ainsi qu'il repasse devant la fenêtre principale. Si on veut par contre un effet et voir le splashscreen disparaître petit à petit, on peut mettre TimeSpan.FromSeconds(1) qui va faire durer l'effet pendant une seconde.
Conclusion
Voilà une classe qui était attendue et qui est arrivée avec le SP1 de .NET 3.5 et VS 2008. On regrettera que la classe ne permette d'afficher que des PNG, pas d'image animée ni rien d'autre, et qu'il y ait un petit effet disgracieux quand on l'utilise directement via la BuildAction. J'ai essayé cette classe avec compositeWPF (Prism) et cela permet d'avoir le splashscreen pendant le chargement et l'initialisation des modules, ce qui n'est pas si mal. De plus, elle est quand même vraiment facile à mettre en oeuvre. On trouvera d'autres détails concernant cette classe sur le post what's new in WPF 3.5 sp1: Splash Screen to improve perceived startup perf.
Happy programming!
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :