May 14 2008 8:50AM GMT
Posted by: Mark Shurmer
WPF,
printing,
XAML
I have blogged before on how you print a WPF element using the PrintVisual method in the PrintDialog class, which is very flexible as it will print any element derived from Systems.Windows.Media.Visual.
However, there is another weapon in the PrintDialog armoury, and that is the ability to print documents. Given the extensive document support in WPF, it comes as no surprise that you can easily print these documents.
To do that you need to get at the DocumentPaginator object - it’s purpose in life lies in managing content as pages which is just perfect for the job.
You get at it by using the IDocumentPaginatorSource interface, like this:
assuming docRdr is a FlowDocumentScrollViewer
PrintDialog prtDlg = new PrintDialog();
if(prtDlg.ShowDialog() == true)
{
prtDlg.PrintDocument(((IDocumentPaginatorSource)docRdr.Document).DocumentPaginator, “Statement”);
}
This will print the document for you just fine
Apr 24 2008 2:24PM GMT
Posted by: Mark Shurmer
WPF,
printing
From a previous post of mine, you can see how to easily increase the size of a WPF element in order to print it.
That’s not much use though as you are still only hard coding the sizing.
What would be better is to use the height and width of the paper that has been selected.
Lo and behold, thats easy to do, using the PrintDialog class itself.
One further wrinkle is that you need to make sure that the actual element is resized, and you do that by telling it to resize itself.
Say you have an instance of PrintDialog called prtDlg:
Size pageSize = new Size(prtDlg.PrintableAreaWidth -30, prtDlg.PrintableAreaHeight - 30);
grd.Measure(pageSize);
grd.Arrange(new Rect(15, 15, pageSize.Width, pageSize.Height));
prtDlg.PrintVisual(grd, “My grid”);
Where grd is a Grid control containing a number of other elements
Apr 22 2008 3:25PM GMT
Posted by: Mark Shurmer
WPF,
XAML,
printing
When you get to printing in WPF, you will find it so much easier than printing in previous Microsoft UI design (ie Winforms and MFC). See a previous post of mine to see how easy.
One thing that does occur though, is that when you print your element/canvas/grid/whatever, it will usually go on the printer very small. Why is that?
Actually, I think it is a good thing 
What it means is that it’s printing exactly the same on the printer as on the screen, something we have been begging for, for ages [well since we’ve had GUI’s anyway].
So how can you make it bigger, well it’s pretty easy when you know how:
You simply make the element bigger by using a Transform before printing, like
grid.LayoutTransform = new ScaleTransform(6,6);
printDlg.PrintVisual(grid, “My vision”);
Apr 11 2008 2:48PM GMT
Posted by: Mark Shurmer
WPF,
XAML,
printing
To do a simple print in WPF, you can do the following:
PrintDialog prtDlg = new PrintDialog();
if(prtDlg.ShowDialog() == true)
{
prtDlg.PrintVisual(element, “A simple drawing”);
}
This will throw up the XP or Vista print dialog, and then print the element specified, no problems at all.
Actually there are a couple of problems:
- The element is always lined up in the top left of the printed page
- If you haven’t specified any margin, the element might get cut off
- There’s no pagination
- It uses the same device independent system for printing as showing on the screen ,1:96, so an element 96 pixels wide will appear 1 inch wide on the printed paper
Apr 11 2008 2:37PM GMT
Posted by: Mark Shurmer
WPF,
XAML,
printing
How does printing work with WPF?
Well, actually, if anyone out there has ever worked with printing in MFC, then it’s so advanced as to make you dizzy.
Even if you ever tried printing with Windows Forms, then printing in WPF is a bit of a revelation.
So how does it work?
Most of the printing stuff is in the System.Printing namespace, and a good starting place is the PrintDialog class.
By instantiating the PrintDialog class, you can display the standard xp or vista print dialog to allow the user to choose where to print something and how.
What else does it give you?
You can call two different methods to do printing:
PrintVisual - allows you print any class that derives from System.Windows.Media.Visual - which is a lot 
PrintDocument - allows you to print any DocumentPaginator, e.g. FlowDocument or XpsDocument.
And it just works 