Originally posted on http://lancerobinson.net/archive/2010/08/20/exploring-silverlight-4-ndash-part-i-the-printing-api.aspx
One of the major peeves that Silverlight developers had in its earlier versions was the lack of printing support. Printing is an essential feature of many applications and more so in the case of LOB applications. Hence, when Silverlight 4 was released with a full featured Printing
API, developers welcomed it with open arms.
What’s Included in the Printing API
The System.Windows.Printing
namespace:
This namespace provides printing services for a Silverlight application through its various classes.
Class Name
| What It Does
|
PrintDocument
| Provides printing capabilities for a Silverlight application
|
PrintPageEventArgs
| Provides data for the PrintPage event
|
BeginPrintEventArgs
| Provides data for the BeginPrint event
|
EndPrintEventArgs
| Provides data for the EndPrint event
|
PrintDocument Class
The commonly used methods, properties, and events of this class are as follows:
Method
| Description
|
Print
| Starts the printing process for the specified document by opening the print dialog box.
|
Property
| Description
|
PrintedPageCount
| Gets the number of pages that have printed.
|
Event
| Description
|
BeginPrint
| Occurs after the Print() method is called and the print dialog box successfully returns, but before the PrintPage event is raised.
|
EndPrint
| Occurs when the printing operation is complete or when the print operation is canceled by the application author.
|
PrintPage
| Occurs when each page is printing.
|
PrintPageEventArgs Class
The commonly used properties of this class are:
Name
| Description
|
HasMorePages
| Retrieves or specifies whether there are more pages to print.
|
PageMargins
| Retrieves the margins of the page that is currently printing.
|
PageVisual
| Retrieves or specifies the visual element to print.
|
PrintableArea
| Retrieves the size of the printable area.
|
Basic Steps for Adding Printing Functionality in a Silverlight Application
- Add a Print button or a Print menu option through which user can initiate a print operation.
- Create an instance of
PrintDocument
in the application - Call the
Print()
method to open a print dialog box - Write code for the
PrintPage
event handler for PrintDocument
to perform the print operation
You have several options for printing: print the entire Silverlight control, print part of a control, and so forth.
If you set the PageVisual
property to the layout root of the Silverlight content, such as a Grid
, you can print the entire control. If you set PageVisual
to a particular control or UIElement
, you can print only that Silverlight control.
The HasMorePages
property can be used to print multiple pages.
Enough said about the theory, let’s now move on to some examples.
Example
Assume that you have created a TreeView
application and want to print the entire content of the grid. A button, Print
, is added to the page. The markup for MainPage.xaml is as follows:
Listing 1
<UserControl x:Class="TreeViewPrint.MainPage"
xmlns="http://schemas.microsoft.com/winfx/
2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression
/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400"
xmlns:
sdk="http://schemas.microsoft.com/winfx/
2006/xaml/presentation/sdk">
<Grid x:Name="LayoutRoot" Background="LightSeaGreen">
<sdk:TreeView Width="150" Height="150"
Background="Beige" Name="techTree">
<sdk:TreeViewItem Header="Microsoft Technology"
IsExpanded="True" >
<sdk:TreeViewItem Header=".NET" IsExpanded="True">
<sdk:TreeViewItem Header="C#" >
<sdk:TreeViewItem Header="3.0">
<sdk:TreeViewItem Header="4.0">
</sdk:TreeViewItem>
</sdk:TreeViewItem>
</sdk:TreeViewItem>
</sdk:TreeViewItem>
</sdk:TreeViewItem>
</sdk:TreeView>
<Button Content="Print" Height="23" HorizontalAlignment="Left"
Name="btnPrint" Width="75" Click="btnPrint_Click" />
</Grid>
</UserControl>
The markup creates a TreeView
control, adds TreeViewItems
to it, and creates a button with caption, Print.
In the code-behind, write the following code:
Listing 2
private void btnPrint_Click(object sender, RoutedEventArgs e)
{
PrintDocument prnt = new PrintDocument();
prnt.PrintPage += new
EventHandler<PrintPageEventArgs>(prnt_PrintPage);
prnt.Print("TreeView Application");
}
void prnt_PrintPage(object sender, PrintPageEventArgs e)
{
e.PageVisual = LayoutRoot;
}
The above code is simple and self-explanatory.
To print only the tree and not the whole grid, you can fine tune the above code as follows:
Listing 3
void prnt_PrintPage(object sender, PrintPageEventArgs e)
{
e.PageVisual = techTree;
}
Tip: To print a Silverlight 4 RichTextBox
without a surrounding border, set BorderBrush="{x:Null}"
You can add headers and footers to the page by using TextBlock
controls. The PrintableArea
property of PrintPageEventArgs
enables you to set the print area.
There is a lot more to explore in the printing API but this is it from me for now. With time, there will be more to come.
CodeProject