Remember my post on printing in Silverlight 3, using the WriteableBitmap. This class allowed to export UI elements to an image and print from there. While it was working, it wasn’t a great way of doing things.
Silverlight 4 brings real printing to the table. All printing is done using the PrintDocument class. In it’s PrintPage event, we can specify what content needs to be printed. This can be the entire screen, a control that’s part of the visual tree or even a control that’s generated on the fly. Finally, we use the Print() method to perform the actual printing of the document.
Let’s take a look at some really easy code to do all this.
The UI code is kept simple intentionally:
<Grid x:Name="LayoutRoot" Background="White">
<TextBlock Height="25" HorizontalAlignment="Left" Margin="62,92,0,0" Name="textBlock1" Text="I want to print!" VerticalAlignment="Top" Width="194" FontWeight="Bold" FontSize="15" />
<Button Content="Print" Height="55" HorizontalAlignment="Left" Margin="62,213,0,0" Name="PrintButton" VerticalAlignment="Top" Width="216" Click="PrintButton_Click" />
</Grid>
This looks like the following:
In the click event of the button, we write some printing code.
private void PrintButton_Click(object sender, RoutedEventArgs e)
{
PrintDocument document = new PrintDocument();
document.PrintPage += (s, args) =>
{
args.PageVisual = LayoutRoot;
};
document.Print();
}
This will now show a print preferences dialog, in which we can select a printer. The result in this case is the entire UI being printed, because LayoutRoot was specified.
We can also hook into the beginning and ending of the printing process using the StartPrint and EndPrint event. These can be used to execute some code at the start or ending of the printing process.