Blue Theme Orange Theme Green Theme Red Theme
 
Team Foundation Server Hosting
Home | Forums | Videos | Photos | Blogs | Beginners | Advertise with Us
 | Consulting  
Submit an Article Submit a Blog 
 Jump to
Skip Navigation Links
TechnologyExpand Technology
WebsiteExpand Website
Team Foundation Server Hosting
Search :       Advanced Search »
Home » XAML » WPF Printing in XAML

WPF Printing in XAML

Printing has changed in WPF if you compare with GDI and GDI+. This article discusses the process of printing in WPF and how to create a FlowDocument dynamically and print it in WPF using a PrintDialog control.

Author Rank :
Page Views : 1491
Downloads : 0
Rating :
 Rate it
Level : Beginner
   Print Read/Post comments Post a comment  Similar Articles  
   Email to a friend  Bookmark  Author's other articles  
 
Mindcracker MVP Summit 2012
Become a Sponsor
 Tag Cloud
 Latest Jobs
More ... 
 Latest Interview Questions
More ... 


Printing FlowDocument in WPF

This article demonstrates how to create a FlowDocument dynamically and print it in WPF.

Introduction

Printing in WPF has changed drastically in WPF. If are used to write printing applications using GDI or GDI+, you will have to start thinking in a different way. Now, you have to think of a FlowDocument. If you want to print in WPF, what you actually need to do is, create a FlowDocument object, add your contents what you would like to print to this FlowDocument and send this FlowDocument object to the printer.

Before you write your printing code, you must make sure you import these two namespaces in your project.

using System.Printing;

using System.Windows.Documents;

 

The System.Windows.Documents namespace is already added to your project when you create a new WPF project. The System.Printing namespace is required for the printing functionality.

Printing Process

OK, here are the steps required to print a FlowDocument in WPF.

1. Create a PrintDialog


The following code creates a PrintDialog in WPF code.

// Create a PrintDialog

PrintDialog printDlg = new PrintDialog();

 

2. Create a FlowDocument

 

The FlowDocument object is used to create a FlowDocument. It has items such as a paragraph, run, line, image and so on. The following code snippet creates a FlowDocument and adds a line of text to the document.

 

// Create a FlowDocument dynamically.

FlowDocument doc = new FlowDocument(new Paragraph(new Run("Some text goes here")));

doc.Name = "FlowDoc";

 

3. Create an IDocumentPaginatorSource

The third step is to create an IDocumentPaginatorSource object from a FlowDocument that is pretty simple as listed here. You direct convert a FlowDocument to an IDocumentPaginatorSource.

// Create IDocumentPaginatorSource from FlowDocument

IDocumentPaginatorSource idpSource = doc;

 

4. Call PrintDialog.PrintDocument method

The last step is to call PrintDialog.PrintDocument method to call the print dialog that will allow you to select a printer and send document to the printer to print it. The PrintDocument method of PrintDialog takes a DocumentPaginator object that you can get from IDocumentPaginatorSource.DocumentPaginator property as listed in the following code:

// Call PrintDocument method to send document to printer

printDlg.PrintDocument(idpSource.DocumentPaginator, "Hello WPF Printing.");    

 

The Application

Ok now you know what is required to print FlowDocuments in WPF, let's create a working application. Create a WPF Application and add a Button control to the Window.  

After that, change the Name attribute of the button to PrintSimpleTextButton and double click on it to write a button click event handler. My XAML code of MainWindow looks like Listing 1.

<Window x:Class="PrintingTextSample.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="MainWindow" Height="350" Width="525">

    <Grid>

        <Button Content="Print Simple Text" Height="37" HorizontalAlignment="Left" Margin="22,21,0,0"

                Name="PrintSimpleTextButton" VerticalAlignment="Top" Width="134"

                Click="PrintSimpleTextButton_Click" />

    </Grid>

</Window>

 

Listing 1

 

Now I am going to create a FlowDocument in WPF. The CreateFlowDocument method in Listing 2 creates and returns a FlowDocument object. The Paragraph, Section, Underline objects represent a paragraph, section, and underline of a document. You can add as many contents to your FlowDocument here. I am writing a tutorial on working with FlowDocuments in WPF. Stay tuned for it.

/// <summary>

/// This method creates a dynamic FlowDocument. You can add anything to this

/// FlowDocument that you would like to send to the printer

/// </summary>

/// <returns></returns>

private FlowDocument CreateFlowDocument()

{

    // Create a FlowDocument

    FlowDocument doc = new FlowDocument();

 

    // Create a Section

    Section sec = new Section();

 

    // Create first Paragraph

    Paragraph p1 = new Paragraph();

    // Create and add a new Bold, Italic and Underline

    Bold bld = new Bold();

    bld.Inlines.Add(new Run("First Paragraph"));

    Italic italicBld = new Italic();

    italicBld.Inlines.Add(bld);

    Underline underlineItalicBld = new Underline();

    underlineItalicBld.Inlines.Add(italicBld);

    // Add Bold, Italic, Underline to Paragraph

    p1.Inlines.Add(underlineItalicBld);

 

    // Add Paragraph to Section

    sec.Blocks.Add(p1);

 

    // Add Section to FlowDocument

    doc.Blocks.Add(sec);

 

    return doc;

}

Listing 2

 

Now, we are going to write code on the button click event handler that will create a FlowDocument and print it.

 

 As you can see from the code listed in Listing 3, we follow the steps discussed in the previous section. I first create a PrintDialog, then create a FlowDocument, convert it to an IDocumentPaginatorSource and in the end, call PrintDialog.PrintDocument method.

 

private void PrintSimpleTextButton_Click(object sender, RoutedEventArgs e)

{

    // Create a PrintDialog

    PrintDialog printDlg = new PrintDialog();

 

    // Create a FlowDocument dynamically.

    FlowDocument doc = CreateFlowDocument();

    doc.Name = "FlowDoc";

 

    // Create IDocumentPaginatorSource from FlowDocument

    IDocumentPaginatorSource idpSource = doc;

 

    // Call PrintDocument method to send document to printer

    printDlg.PrintDocument(idpSource.DocumentPaginator, "Hello WPF Printing.");           

}

 Listing 3

 

Summary

In this article, I demonstrated how to create a FlowDocument object dynamically and send it to a printer to print it by using a PrintDialog control available in WPF.

Comment Request!
Thank you for reading this post. Please post your feedback, question, or comments about this post Here.
Login to add your contents and source code to this article
 [Top] Rate this article
 
 About the author
 
Dinesh Beniwal
Looking for C# Consulting?
C# Consulting is founded in 2002 by the founders of C# Corner. Unlike a traditional consulting company, our consultants are well-known experts in .NET and many of them are MVPs, authors, and trainers. We specialize in Microsoft .NET development and utilize Agile Development and Extreme Programming practices to provide fast pace quick turnaround results. Our software development model is a mix of Agile Development, traditional SDLC, and Waterfall models.
Click here to learn more about C# Consulting.
 
Introducing MaxV - one click. infinite control. Hyper-V Hosting from MaximumASP.
Finally – a virtual platform that delivers next-generation Windows Server 2008 Hyper-V virtualization technology from a managed hosting partner you can truly depend on. Visit www.maximumasp.com/max for a FREE 30 day trial. Hurry offer ends soon. Climb aboard the MaxV platform and take advantage of High Availability, Intelligent Monitoring, Recurrent Backups, and Scalability – with no hassle or hidden fees. As a managed hosting partner focused solely on Microsoft technologies since 2000, MaximumASP is uniquely qualified to provide the superior support that our business is built on. Unparalleled expertise with Microsoft technologies lead to working directly with Microsoft as first to offer IIS 7 and SQL 2008 betas in a hosted environment; partnering in the Go Live Program for Hyper-V; and product co-launches built on WS 2008 with Hyper-V technology.
Dynamic PDF
ceTE software specializes in components for dynamic PDF generation and manipulation. The DynamicPDF™ product line allows you to dynamically generate PDF documents, merge PDF documents and new content to existing PDF documents from within your applications.
Discover the top 5 tips for understanding .NET
Ricky Leeks presents the top 5 tips for understanding .NET Interoperability. Learn more.
Nevron Chart for .NET 2010.1 Now Available
The leading .NET charting control now features PDF, Flash and Silverlight export, visualization of large datasets and more. Deliver true charting functionality to your BI, Scorecard, Presentation or Scientific apps. Download evaluation now.
ASP.NET 4 Hosting
Get 2 Months Free of ASP.NET Hosting for Only $4.95/month! Receive FREE MS SQL and MySQL Databases Including ASP.NET 4/3.5, MVC 3.0, Silverlight 4, Windows 2008/IIS 7.0 Plus FREE IIS 7 Modules. Host UNLIMITED ASP.NET Web Sites – Click Here!
 
 Post a Feedback, Comment, or Question about this article
Subject:
Comment:
DevExpress Free UI Controls
Become a Sponsor
 Comments
Team Foundation Server Hosting
 © 2012  contents copyright of their authors. Rest everything copyright Mindcracker. All rights reserved.