WPF:打印没有打印对话框的FlowDocument

时间:2010-08-28 20:53:13

标签: wpf printing flowdocument

我正在WPF中写一个笔记记录应用程序,每个笔记都使用FlowDocument。该应用按标签搜索和过滤笔记。我想将当前筛选列表中的所有笔记打印为单独的文档,我只想在作业开头显示一个打印对话框。

我找到了一个很好的打印示例in this thread,但它适用于打印单个FlowDocument,因此它使用显示打印对话框的CreateXpsDocumentWriter()重载。

所以,这是我的问题:有人可以建议一些好的代码来打印FlowDocument而不显示PrintDialog吗?我想我将在程序开始时显示“打印对话框”,然后循环我的笔记集以打印每个FlowDocument

2 个答案:

答案 0 :(得分:3)

我已经重写了我对这个问题的回答,因为我确实找到了一种更好的方法来打印一组FlowDocuments,同时只显示一次Print Dialog。答案来自MacDonald,Pro WPF in C#2008(Apress 2008),第20章,p。 704。

我的代码将一组Note对象捆绑到名为notesToPrint的IList中,并从我的应用程序中的DocumentServices类获取每个Note的FlowDocument。它设置FlowDocument边界以匹配打印机并设置1英寸的边距。然后使用文档的DocumentPaginator属性打印FlowDocument。这是代码:

// Show Print Dialog
var printDialog = new PrintDialog();
var userCanceled = (printDialog.ShowDialog() == false);
if(userCanceled) return;

// Print Notes
foreach(var note in notesToPrint)
{
    // Get next FlowDocument
    var collectionFolderPath = DataStore.CollectionFolderPath;
    var noteDocument = DocumentServices.GetFlowDocument(note, collectionFolderPath) ;

    // Set the FlowDocument boundaries to match the page
    noteDocument.PageHeight = printDialog.PrintableAreaHeight;
    noteDocument.PageWidth = printDialog.PrintableAreaWidth;

    // Set margin to 1 inch
    noteDocument.PagePadding = new Thickness(96);

    // Get the FlowDocument's DocumentPaginator
    var paginatorSource = (IDocumentPaginatorSource)noteDocument;
    var paginator = paginatorSource.DocumentPaginator;

    // Print the Document
    printDialog.PrintDocument(paginator, "FS NoteMaster Document");
}

这是一种非常简单的方法,有一个重要的限制:它不会异步打印。要做到这一点,你必须在后台线程上执行此操作,这就是我的工作方式。

答案 1 :(得分:1)

获得printDialog之后只需一个循环。

for(int i=0 i<document.count i++)
    printdocument((document[i] as iDocumentPaginator),"title"+[i]);