2010-12-15 75 views
4

Je souhaite créer un objet Window, définir des valeurs et l'envoyer directement à l'imprimante sans le montrer. Je pensais que c'était la bonne chose à faire, mais montre un document vierge.Impression d'une fenêtre masquée dans 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(); 

Pour vérifier le code d'impression est ok, je l'ai mis dans la forme événement Loaded, appelez Show(), et il fonctionne très bien.

+0

sans qu'il soit rendu, je doute que le visuel sera généré. – user7116

+0

et il n'y a aucun moyen de provoquer le rendu sans appeler Show()? –

+2

Juste une pensée folle, et si vous montrer la fenêtre quelque part en dehors de l'écran, sans le montrer dans la barre des tâches et sans l'activer? –

Répondre

3

Il n'est pas nécessaire de créer une fenêtre cachée, vous pouvez rendre les contrôles WPF pour l'impression en utilisant un DocumentPage. Pour imprimer DocumentPage s, vous devrez étendre la classe DocumentPaginator.

Le code pour implémenter un DocumentPaginator simple qui imprimera List de UIElements est ci-dessous.

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

Enfin, pour faire l'impression, vous ne devez:

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