2010-12-15 17 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(); 

はOKですが、私は()表示を呼び出し、フォームロードイベント内でそれを入れて、それが正常に動作します。

+0

。 – user7116

+0

、Show()を呼び出さずにレンダリングさせる方法はありませんか? –

+2

ちょっと夢中に思えますが、画面の外のどこかにウィンドウを表示して、タスクバーに表示せずにアクティブにしないとどうなりますか? –

答えて

3

隠しウィンドウを作成する必要はありません。DocumentPageを使用して印刷用のWPFコントロールをレンダリングできます。 DocumentPageを印刷するには、DocumentPaginatorクラスを拡張する必要があります。

ListUIElementsを印刷する単純なDocumentPaginatorを実装するコードは次のとおりです。

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; } 
    } 
} 

最後に、印刷を行うには、あなただけに必要になります。それは、私は、Visualが生成されます疑うレンダリングされるものではないが

dialog.PrintDocument(new DocumentPaginatorImpl(pages), "Print Job Description"); 
関連する問題