Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Frédéric Hamel

Assert.Success();

[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 :
Posted: mardi 19 août 2008 07:20 par fredhamel
Classé sous : , ,

Commentaires

richardc a dit :

SVP: arrêtez d'utiliser var à tout va !

# août 19, 2008 10:55

Erebuss a dit :

Le Var c'est comme les antibiotiques, c'est pas automatique ;)

Pout info, ya une petite polémique là dessus chez Jetbrains ... pour faire que Resharper ne propose pas à tout va de remplacer une déclaration explicite de type par var.

Sinon pour revenir au sujet, c'est pas mal :)

# août 19, 2008 13:21

fredhamel a dit :

Hello, en effet la polémique est connue.

Sur la question de "var" j'en profite pour donner mon avis.

Pour moi le véritable problème n'est pas "var" mais le nom de la variable. En effet, le code que j'ai posté à été programmé avec intension. C'est-à-dire que l'intension de chaque variable a été explicité.

Je trouve personnellement

var mainWindow = new Window1(); infiniment mieux que Window1 w = new Window1();  

Je n'ai aucune idée de ce à quoi "w" vas servir alors que je comprend parfaitement que la "mainWindow" est la fenêtre principale du programme. De plus, pour ma part, je ne gagne pas d'information à voir deux fois Window1 sur la même ligne.

Pour moi, la polémique autour de var n'a pas lieux d'être. Programmer un code lisible est un chalenge, que je trouve pour ma part, à des années lumières de l'utilisation de var ou pas.

Puisque la question de la lisibilité est intéressante j'aimerais quand même souligner que le point qui n'a pas été programmé avec intension est le "false" de splashScreen.Show(false);. En effet, sans IntelliSense ou la documentation impossible de savoir d'un coup d'œil à quoi sert ce false.  Microsoft aurai pu choisir une option plus lisible comme une enum : CloseOptions.Manuel et CloseOptions.Auto.

# août 19, 2008 14:06
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Créer un périphérique Windows To Go 10 ! par Blog de Jérémy Jeanson le 11-21-2014, 04:54

- RDV à Genève le 12 décembre pour l’évènement “SharePoint–Office 365 : des pratiques pour une meilleure productivité !” par Le blog de Patrick [MVP Office 365] le 11-19-2014, 10:40

- [IIS] Erreurs web personnalisées par Blog de Jérémy Jeanson le 11-19-2014, 00:00

- BDD/TDD + Javascript par Fathi Bellahcene le 11-16-2014, 16:57

- Sécuriser sans stocker de mots de passe par Blog de Jérémy Jeanson le 11-15-2014, 08:58

- Où télécharger la preview de Visual Studio 2015 ? par Blog de Jérémy Jeanson le 11-13-2014, 21:33

- Les cartes sont partout ! par Le blog de Patrick [MVP Office 365] le 11-13-2014, 17:26

- [ #Office365 ] Courrier basse priorité ! par Le blog de Patrick [MVP Office 365] le 11-12-2014, 08:56

- [Oracle] Fichier oranfsodm12.dll absent du package client par Blog de Jérémy Jeanson le 11-10-2014, 20:44

- [ #Office365 ] Le chapitre 1 des Groupes est écrit, et alors ? par Le blog de Patrick [MVP Office 365] le 11-10-2014, 20:23