2010-12-15 132 views
4

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

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(); 

要验证打印代码是好的,我把它的形式加载事件中,调用Show(),它工作正常。

+0

没有它被渲染我怀疑视觉上就会产生。 – user7116 2010-12-15 17:08:21

+0

并且没有办法让它在不调用Show()的情况下渲染? – 2010-12-15 20:14:23

+2

只是一个疯狂的想法,如果你将窗口显示在屏幕之外的某个地方,而没有在任务栏中显示并且没有激活它,该怎么办? – 2010-12-15 21:08:08

回答

3

没有必要创建一个隐藏的窗口,您可以通过使用DocumentPage呈现WPF控件进行打印。要打印DocumentPage s,您需要扩展DocumentPaginator类。

执行简单DocumentPaginator的代码将打印出UIElements的任何List如下。

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