在WPF中打印隐藏窗口

时间:2010-12-15 16:50:51

标签: c# wpf xaml printing

我有一个我想要创建的Window对象,设置了一些值,然后直接发送到打印机而不显示它。我认为这是正确的做法,但显示一个空白的文档。

PrintDialog dlg = new PrintDialog();

ReportWindow rw = new ReportWindow(); //WPF Window object

var sz = new Size(96*8.5, 96*11);     //size of a paper page, 8.5x11

rw.Measure(sz); rw.Arrange(new Rect(sz)); 

//   rw.Show();  //want to keep it hidden

dlg.PrintVisual(rw, "report printout");

rw.Close(); 

要验证打印代码是否正常,我将其放在表单Loaded事件中,调用Show(),它工作正常。

2 个答案:

答案 0 :(得分:3)

无需创建隐藏窗口,您可以使用DocumentPage呈现WPF控件以进行打印。要打印DocumentPage,您需要扩展DocumentPaginator类。

实现简单DocumentPaginator的代码可以打印出List UIElements class DocumentPaginatorImpl : DocumentPaginator { private List<UIElement> Pages { get; set; } public DocumentPaginatorImpl(List<UIElement> pages) { Pages = pages; } public override DocumentPage GetPage(int pageNumber) { return new DocumentPage(Pages[pageNumber]); } public override bool IsPageCountValid { get { return true; } } public override int PageCount { get { return Pages.Count; } } public override System.Windows.Size PageSize { get { /* Assume the first page is the size of all the pages, for simplicity. */ if (Pages.Count > 0) { UIElement page = Pages[0]; if (page is Canvas) return new Size(((Canvas)page).Width, ((Canvas)page).Height); // else if ... } return Size.Empty; } set { /* Ignore the PageSize suggestion. */ } } public override IDocumentPaginatorSource Source { get { return null; } } } 以下的内容。

dialog.PrintDocument(new DocumentPaginatorImpl(pages), "Print Job Description");

最后,要进行打印,您只需要:

{{1}}

答案 1 :(得分:0)

而不是打印窗口,而是打印该窗口的主网格的内容。

<Grid x:Name="maingrid">
    <!-- All content here -->
</Grid>

然后在您的代码中

MyWindow myWindow = new MyWindow();
PrintDialog printDialog = new PrintDialog();
printDialog.PrintVisual(myWindow.maingrid, string.Empty);
myWindow.Close();