如何批量打印多个可视元素作为一项任务?

时间:2013-07-04 13:39:01

标签: c# wpf object printing

我有多个UserControl,其中每个代表一个页面,但我不知道如何打印它们,因为到现在为止我只能打印一个UserControl

以下是我打印单UserControl的方式:

PrintDialog printDlg = new PrintDialog();
if (printDlg.ShowDialog() == true)
{
     printDlg.PrintVisual((UserControl)myUserControl, "optionalname");
}

如何在一个任务中打印Visual类型的多个对象?

1 个答案:

答案 0 :(得分:2)

经过更多的研究,我发现在Blog之后有人试图在没有运气的情况下实现同样的事情,因为他有一些副本和过去的错别字。我修正了他的拼写错误,效果很好。

这里有一份工作样本:

using System;
using System.Printing;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Xps;

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        List<UIElement> UC = new List<UIElement>();

        for (int i = 0; i < 3; i++)
        {
            var uc = new UserControl
            {
                Background = Brushes.Red,
                Content = new TextBlock
                {
                    Text = "Box:" + i,
                    Margin = new Thickness(12),
                    Background = Brushes.Orange
                }
            };
            UC.Add(uc);
        }

        var pDialog = new PrintDialog();

        if (pDialog.ShowDialog() == true)
        {
            var xpsDocWriter = PrintQueue.CreateXpsDocumentWriter(pDialog.PrintQueue);
            PrintUIElements(xpsDocWriter, UC);
        }
    }

    /// <summary>
    /// Used the XpsDocumentWriter to write a FixedDocumentSequence which contains the UIElements as single pages
    /// </summary>
    /// <param name="xpsWriter"></param>
    /// <param name="uiElements"></param>
    private void PrintUIElements(XpsDocumentWriter xpsWriter, List<UIElement> uiElements)
    {
        FixedDocumentSequence fixedDocSeq = new FixedDocumentSequence();

        foreach (UIElement element in uiElements)
        {
            (fixedDocSeq as IAddChild).AddChild(toDocumentReference(element));

        }

        // write the FixedDocumentSequence as an XPS Document
        xpsWriter.Write(fixedDocSeq);
    }

    /// <summary>
    /// encapsulater for a UIElement in an DocumentReference
    /// DocumentReference(FixedDocument(PageContent(FixedPage(UIElement))))
    /// to simplify the print of multiple pages
    /// </summary>
    /// <param name="uiElement">the UIElement which</param>
    /// <returns>creates a DocumentReference</returns>
    private DocumentReference toDocumentReference(UIElement uiElement)
    {
        if (uiElement == null)
            throw new NullReferenceException("the UIElement has to be not null");

        FixedPage fixedPage = new FixedPage();
        PageContent pageContent = new PageContent();
        FixedDocument fixedDoc = new FixedDocument();
        DocumentReference docRef = new DocumentReference();

        #region Step1

        // add the UIElement object the FixedPage
        fixedPage.Children.Add(uiElement);

        #endregion

        #region Step2

        // add the FixedPage to the PageContent collection
        pageContent.BeginInit();
        ((IAddChild)pageContent).AddChild(fixedPage);
        pageContent.EndInit();

        #endregion

        #region Step 3

        // add the PageContent to the FixedDocument collection
        ((IAddChild)fixedDoc).AddChild(pageContent);

        #endregion

        #region Step 4

        // add the FixedDocument to the document reference collection
        docRef.BeginInit();
        docRef.SetDocument(fixedDoc);
        docRef.EndInit();

        #endregion

        return docRef;
    }
}

修改

上面的代码包含第一页的绑定错误,但我能够修复它。

/// <summary>
/// Used the XpsDocumentWriter to write a FixedDocument which get created and contains the UIElements as single pages
/// </summary>
/// <param name="xpsWriter">XpsDocumentWriter</param>
/// <param name="uiElements">List of UIElement</param>
private void PrintUIElements(XpsDocumentWriter xpsWriter, List<UIElement> uiElements)
{
    var fixedDoc = new FixedDocument();

    foreach (UIElement element in uiElements)
    {
        var fixedPage = new FixedPage();
        var pageContent = new PageContent();

        // add the UIElement object the FixedPage
        fixedPage.Children.Add(element);

        // add the FixedPage object the PageContent
        pageContent.Child = fixedPage;

        // add the PageContent object the FixedDocument
        fixedDoc.Pages.Add(pageContent);
    }

    xpsWriter.Write(fixedDoc);
}