2010-08-28 35 views
6

Tôi đang viết một ứng dụng ghi chú trong WPF, sử dụng FlowDocument cho từng ghi chú riêng lẻ. Ứng dụng tìm kiếm và lọc ghi chú theo thẻ. Tôi muốn in tất cả các ghi chú trong danh sách được lọc hiện tại dưới dạng tài liệu riêng biệt và tôi chỉ muốn hiển thị một Hộp thoại in ở đầu công việc.WPF: Lưu lượng in Tài liệu không có hộp thoại in

Tôi đã tìm thấy một ví dụ in tốt in this thread, nhưng nó được hướng tới việc in một đơn FlowDocument, do đó, nó sử dụng quá tải CreateXpsDocumentWriter() hiển thị Hộp thoại in.

Vì vậy, đây là câu hỏi của tôi: Có ai có thể đề xuất một số mã tốt để in FlowDocument mà không hiển thị PrintDialog không? Tôi hình tôi sẽ hiển thị Hộp thoại In ở đầu thủ tục và sau đó lặp qua bộ sưu tập ghi chú của tôi để in mỗi FlowDocument.

Trả lời

3

Tôi đã viết lại câu trả lời cho câu hỏi này, bởi vì tôi đã tìm cách tốt hơn để in một bộ FlowDocuments, trong khi chỉ hiển thị Hộp thoại In một lần. Câu trả lời đến từ MacDonald, Pro WPF trong C# 2008 (Apress 2008) trong Chương 20 tại trang. 704.

Mã của tôi bao gồm một tập hợp các đối tượng Ghi chú thành một IList được gọi là notesToPrint và lấy FlowDocument cho từng Ghi chú từ lớp DocumentServices trong ứng dụng của tôi. Nó thiết lập các ranh giới FlowDocument để phù hợp với máy in và thiết lập một lề 1 inch. Sau đó, nó in FlowDocument, sử dụng thuộc tính DocumentPaginator của tài liệu. Đây là mã:

// 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"); 
} 

Đây là một cách tiếp cận khá đơn giản, với một giới hạn đáng kể: Nó không in không đồng bộ. Để làm điều đó, bạn sẽ phải thực hiện thao tác này trên một chuỗi nền, đó là cách tôi làm điều đó.

+0

Tôi vẫn muốn tìm cách tốt hơn để thực hiện việc này. Nếu bất cứ ai có thể đề nghị một, tôi sẽ thay đổi câu trả lời được chấp nhận. –

+3

Bạn có thể thử sử dụng các thành viên PrintDialog.PrintQueue và PrintDialog.PrintTicket. Với PrintQueue, bạn có thể tạo XpsDocumentWriter, sau đó bạn có thể sử dụng WriteAsync() để in không đồng bộ. Caching hàng đợi và vé có vẻ tốt hơn so với bộ nhớ đệm PrintDialog. –

+0

Cảm ơn - điều đó rất hữu ích. +1 từ tôi. –

1

Chỉ cần một vòng lặp sau khi bạn đã nhận được printDialog.

for(int i=0 i<document.count i++) 
    printdocument((document[i] as iDocumentPaginator),"title"+[i]); 
Các vấn đề liên quan