Suite aux annonces de la PDC09, Silverlight 4 permet maintenant d'imprimer. Cette fonctionnalité est très importante pour les applications métiers et souvent cette fonctionnalité est incontournable pour un client : pouvoir imprimer un rapport, un graphique, etc...
Cette fonctionnalité est toute simple mais tellement importante !
Voici 3 cas d'utilisation :
Pour notre exemple, voici l'interface de l'application :

Le code XAML :
1 2 3 4 5 6 7 8 9 10 |
<Grid x:Name="LayoutRoot" Height="447" Width="637" > <Grid.Background> <ImageBrush ImageSource="/SL4Print;component/Images/blue_tiles.jpg" /> </Grid.Background> <StackPanel Height="173" HorizontalAlignment="Center" Margin="108,140,104,0" Name="stackPanel1" VerticalAlignment="Top" Width="425" Orientation="Horizontal"> <Image Height="150" Name="image1" Stretch="Fill" Width="200" Margin="5" Source="/SL4Print;component/Images/Desert.jpg" /> <Image Height="150" Name="image2" Stretch="Fill" Width="200" Margin="5" Source="/SL4Print;component/Images/Chrysanthemum.jpg" /> </StackPanel> <Button Content="Imprimer" Height="39" HorizontalAlignment="Center" Margin="200,345,335,0" Name="button1" VerticalAlignment="Top" Width="102" Click="button1_Click" /> </Grid> |
Le code-behind pour l'impression :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public MainPage() { InitializeComponent(); myPrintDoc.PrintPage += new EventHandler<PrintPageEventArgs>(myPrintDoc_PrintPage); }
void myPrintDoc_PrintPage(object sender, PrintPageEventArgs e) { e.PageVisual = stackPanel1; e.HasMorePages = false; }
PrintDocument myPrintDoc = new PrintDocument();
private void button1_Click(object sender, RoutedEventArgs e) { myPrintDoc.DocumentName = "monDoc"; myPrintDoc.Print(); }
|
Dans le MainPage, il est important de s'abonner à l'évènement PrintPage afin de pouvoir définir ce que l'on souhaite imprimer.
L'élément essentiel est le PrintDocument qui est la nouvelle classe d'impression pour Silverlight 4, grâce à elle, on peut désormais déclarer un document qui va nous permettre de gérer l'impression, ici "myPrintDoc".
Dans la méthode "button1_click" (liée à l'évènement click du bouton "Imprimer"), on donne un nom à "myPrintDoc" qui sera le nom proposé par défaut lors de l'impression via une imprimante virtuelle (type PDF, XPS, etc...). Et ensuite, la méthode "Print" est appelée pour lancer l'impression.
L'événement PrintPage est alors levé, et la méthode "myPrintDoc_PrintPage" est appelée. C'est ici qu'il est important de bien préciser ce que l'on souhaite imprimer dans la propriété PageVisual, qui prend un UIElement comme valeur. Dans notre exemple, nous allons lui donner "LayoutRoot" qui est la Grid qui contient toute notre interface. De plus, la propriété HasMorePage, permet d'indiquer si d'autres pages doivent être imprimer ou non. Dans notre cas, nous n'avons qu'une seule page à imprimer, par conséquent HasMorePage est à false.
Et voici le résultat :

- Impression d'une partie de l'écran
Il est possible de n'imprimer qu'une partie de l'interface en précisant le nom de l'UIElement à imprimer, ici nous allons mettre "stackPanel1" qui contient les 2 images dans la propriété PageVisual, afin de ne pas avoir l'image de fond et le bouton Imprimer sur notre impression.
Voici le résultat :

Il est possible de définir un modèle d'impression afin d'organiser les éléments que l'on souhaite imprimer d'une manière différente de celle qui est présentée à l'écran et de rajouter des éléments non présents sur l'interface. Pour cela il faut créer une arborescence d'UIElement dans l'événement PrintPage et de renseigner le nom de l'UIElement racine à la propriété PageVisual pour l'impression.
Le code-behind de notre exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
void myPrintDoc_PrintPage(object sender, PrintPageEventArgs e) { StackPanel stackPrint = new StackPanel() { Width = e.PrintableArea.Width, Height = e.PrintableArea.Height, Orientation = Orientation.Vertical, Background = new SolidColorBrush(Colors.LightGray) };
stackPrint.Measure(e.PrintableArea);
printImage(stackPrint, image1); printImage(stackPrint, image2);
TextBlock txtBlock = new TextBlock(); txtBlock.Text = "Test Imprim Custom"; txtBlock.HorizontalAlignment = HorizontalAlignment.Center;
stackPrint.Children.Add(txtBlock);
e.PageVisual = stackPrint; e.HasMorePages = false; }
private void printImage(StackPanel stackPrint, Image myImage) { Rectangle rect = new Rectangle() { Width = myImage.Width, Height = myImage.Height, Margin = new Thickness(10), Fill = new ImageBrush() { ImageSource = myImage.Source } };
stackPrint.Children.Add(rect); }
|
L'élément StackPanel "stackPrint" est l'UIElement parent qui va contenir les 2 images et un TextBlock en plus.
Le résultat :

Bonne impression à tous ! 