Comme prévu, dans les nombreuses nouveautés de Silverlight 4, nous retrouvons le support de l’impression. Cette fonctionnalité, qui n’était pas présente avant, est tout de même importante pour des applications métiers et souvent incontournable pour un client, qui a souvent besoin d’imprimer des rapports, graphiques ou même encore des plannings. Cette option indispensable est assez simple à implémenter. Nous verrons comment imprimer tout l’écran, puis comment définir la zone à imprimer. Tout ceci se fera grâce à la classe « PrintDocument » qui nous permettra d’ouvrir notre boîte de dialogue et d’imprimer.
Tout d’abord pour commencer, voici un aperçu de notre application de test :
- Une Grid contenant notre bouton, notre StackPanel.
- Deux images, contenues dans le StackPanel.
- Un bouton « Imprimer » pour lancer l’impression.

Comment imprimer l’application ?
Pour commencer n’oubliez pas d’indiquer l’espace nom adéquat : « System.Windows.Printing».
Voici le code XAML de notre application :

En ce qui concerne notre code behind, nous devrons dans le « MainPage » nous abonner à l’évènement « PrintPage » (pour définir ce que nous voulons imprimer) :

Pour l’évènement « PrintPage », nous définissons la zone à imprimer (ici l’ensemble de notre application) et le nombre de pages à imprimer. En mettant « e.HasMorePages » à « false » nous indiquons à notre application qu’il n’y a pas de pages en plus à imprimer. Si nous attribuons à cette propriété la valeur « true », l’évènement « PrintPage » se reproduira jusqu’à ce que « HasMorePages » passe à « false ».
En ce qui concerne le bouton, vous n’avez plus qu’à appeler la méthode « Print » pour lancer l’impression et définir en même temps le nom de votre document (pour tester l’impression vous pouvez utiliser « PDFCreator » ou d’autre logiciel similaire).

Comme vous le voyez la zone que nous avons définie pour l’impression est l’application entière (c’est pourquoi ces horribles couleurs étaient là depuis le début). Cela nous a donc imprimé notre « Grid » entière contenant le « StackPanel », le bouton et nos images.
Comment personnaliser notre impression ?
Affiner notre impression est tout aussi simple : il suffit juste de changer la zone à imprimer. Si nous voulons imprimer nos images, nous n’aurons qu’à changer la valeur de « e.PageVisual ».

Ainsi nous aurons juste nos images d’imprimées et sans le bouton « Imprimer ». La couleur saumon du StackPanel est là pour montrer que le fond est tout de même imprimé. Il suffira de définir la couleur du fond à blanc pour n’avoir que nos images sur une feuille blanche.

Dans le cas où nous ne voulons pas garder la disposition de l’écran, il nous suffira juste de créer plusieurs « UIElement » dans l’évènement « PrintPage » et de renseigner à la propriété « PageVisual » le nom de notre « UIElement » racine.
Ainsi dans notre cas, les images seront aligner comme nous le souhaitons, et nous n’aurons plus nos fond apparent ainsi que notre bouton.


Et voici le résultat : nos images correctement placées sans fond coloré et avec un titre. Si notre contenu est trop grand pour être correctement placé dans la « PrintableArea », il sera découpé (ce qui est le cas plus haut).
Nous avons également à notre disposition l’évènement « BeginPrint » qui nous permet de mettre en place d’autres tâches à effectuer avant d’imprimer (ouverture d’une fenêtre pour faire patienter ou visualiser l’envoi du document à l’imprimante). Avec l’évènement « EndPrint » vous pourrez mettre en place d’autres tâches une fois que l’impression sera terminée (comme par exemple envoyer un signal si l’imprimante n’a plus de papier).
Conclusion
L’apparition de cette fonctionnalité avec la sortie de Silverlight 4 nous permet de rendre les applications Silverlight plus accessible pour les clients. En effet beaucoup d’entre eux trouvaient cette fonctionnalité indispensable.
Même s’il semble facile et rapide de rendre une application Silverlight imprimable, cette fonctionnalité n’en reste pas moins importante de par son utilisation. Comme dit précédemment, pouvoir imprimer son application reste un argument de poids face à un client.
f8db27b4-3972-43c6-80bd-081391114be7|0|.0
Silverlight, Visual Studio 2010