Running on Empty

The few things I know, I like to share.

Using FlowDocument XAML to print XPS Documents. (Part 2)


Welcome to Part 2 of the Using FlowDocument XAML to print XPS Documents.  This article will demonstrate using DataContext to add usefulness to Part 1 of this series.

Creating a “useful” XAML FlowDocument.

First, we need to create a FlowDocument that implements element Binding.  For lack of a better word, I will use “element” to describe a C# class that is used to hold data.

<FlowDocument xmlns=""
  <Paragraph FontFamily="Arial">
      <TextBlock Text="{Binding Path=Sample}"/>

Okay, again not an extremely useful example, trust me, keep reading it gets better.  DataBinding a XAML FlowDocumentFinally, something useful, we get to actually see some data in our FlowDocument. 

There are several ways to bind data in WPF, some declarative, some programmatic and some that are a cross between the two.  Knowing which DataBinding method to use is the trick.  In this sample, since we don’t have a code behind we are going to use DataContext, which is a cross declarative/programmatic mix.  You have already done the declarative piece in the line.

<TextBlock Text="{Binding Path=Sample}"/>

First, create a class to hold some data, this will be our binding element.

namespace Part2
    public class SampleClass
        private string _sample;
        public string Sample
            get { return _sample; }
            set { _sample = value; }

Next, create or refactor the RenderFlowDocumentTemplate method from Part 1.

public static IDocumentPaginatorSource RenderFlowDocumentTemplate(string templatePath, object dataContextObject)
    string rawXamlText = "";
    using (StreamReader streamReader = File.OpenText(templatePath))
        rawXamlText = streamReader.ReadToEnd();

    FlowDocument document = XamlReader.Load(new XmlTextReader(new StringReader(rawXamlText))) as FlowDocument;
    if (dataContextObject != null)
        document.DataContext = dataContextObject;
    return document;

The main addition is the dataContextObject.  I used object base class to make this example more generic, checking for null is simply a precaution, it is not really necessary.

Bringing it together… Again.

Simply create an instance of your element class and pass it to your new and improved RenderFlowDocumentTemplate method.

private void PrintFuelingButton_Click(object sender, RoutedEventArgs e)
    SampleClass sample = new SampleClass();
    sample.Sample = "FlowDocument DataBinding Sample";

    IDocumentPaginatorSource flowDocument =
        XamlTemplatePrinter.RenderFlowDocumentTemplate(Path.Combine(Environment.CurrentDirectory, "XamlDocumentTemplate.xaml"), sample);
    PrintDialog flowPrintDialog = XamlTemplatePrinter.GetPrintDialog();
    if (flowPrintDialog == null)
    PrintQueue flowPrintQueue = flowPrintDialog.PrintQueue;
    XamlTemplatePrinter.PrintFlowDocument(flowPrintQueue, flowDocument.DocumentPaginator);

Obviously, this is a great improvement to Part 1, future articles will focus on dynamic XAML uses and FixedDocument.  As always, I look forward to reading comments and suggestions.


January 2, 2008 - Posted by | C#, WPF, XAML, XPS


  1. very interesting.
    i’m adding in RSS Reader

    Comment by music | January 8, 2008 | Reply

  2. Very Interesting article and worked well.Excellent job and knowledge sharing..Thank you.

    Comment by radhika | July 9, 2008 | Reply

  3. […] FlowDocument XAML to print XPS Documents – 1, 2, 3, 4, 5, […]

    Pingback by Impresión de informes en WPF « Carliños Blog | August 11, 2008 | Reply

  4. Muchas gracias. Es la solución que estaba buscando.

    Comment by Edward | April 17, 2009 | Reply

    • Cool, happy it helped.

      Comment by roecode | April 17, 2009 | Reply

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )


Connecting to %s

%d bloggers like this: