我正在WPF中写一个笔记记录应用程序,每个笔记都使用FlowDocument
。该应用按标签搜索和过滤笔记。我想将当前筛选列表中的所有笔记打印为单独的文档,我只想在作业开头显示一个打印对话框。
我找到了一个很好的打印示例in this thread,但它适用于打印单个FlowDocument
,因此它使用显示打印对话框的CreateXpsDocumentWriter()
重载。
所以,这是我的问题:有人可以建议一些好的代码来打印FlowDocument
而不显示PrintDialog
吗?我想我将在程序开始时显示“打印对话框”,然后循环我的笔记集以打印每个FlowDocument
。
答案 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]);