2009-11-04 27 views
6

Grüße, Ich habe ein Problem mit dem Drucken in WPF. Ich erstelle ein Flow-Dokument und füge diesem Flow-Dokument einige Steuerelemente hinzu. Die Druckvorschau funktioniert einwandfrei und ich habe kein Problem mit dem Drucken aus einem Druckvorschau-Fenster. Das Problem besteht, wenn ich ohne Druckvorschau direkt an den Drucker drucke. Aber was ist überraschender - wenn ich XPS Document Writer als Drucker verwende ist alles in Ordnung, wenn ich einen physischen Drucker verwende, werden einige Steuerelemente in meinem Flow-Dokument nicht angezeigt. Vielen Dank im VorausWPF Drucken Flow Dokument

+4

Grüße, Ich habe das Problem gelöst.Ich habe festgestellt, dass Bindung und Senden von Dokumenten an den Drucker asynchrone Operationen sind. Also habe ich eine Appliaction.DoEvents() Entsprechung in WPF basierend auf BeaStolnitz Artikel erstellt. Dies löste das Problem http://bea.stollnitz.com/blog/index.php?s=doevents –

+0

Der Link in dem obigen Kommentar funktioniert nicht mehr, aber auf der Website, die es umgeleitet leitet auf der Suche nach mir Artikel mit dem DoEvents-Ansatz: http://www.zagstudio.com/blog/493#.UegOCo1dyaI –

Antwort

1

XPS-Dokument kann ohne Probleme gedruckt werden

0

i eins bemerkt haben: Tipp: die Kontrollen, die nicht angezeigt werden, sind die Kontrollen ich einige Daten bin verbindlich, so die Schlussfolgerung ist, dass die Bindung funktioniert nicht. Kann es sein, dass die Bindung nicht ausgeführt wird, bevor das Dokument an den Drucker gesendet wird?

+0

Peter, ein Verwendungstipp für Stackoverflow - wenn Sie Informationen hinzufügen möchten, sollten Sie Ihre ursprüngliche Frage bearbeiten, nicht "Antworten" posten. Im Allgemeinen, wenn Sie auf eine bestimmte Antwort antworten möchten, verwenden Sie einen Kommentar (hmm, außer dass Sie vielleicht noch nicht können!) – Murph

+0

ok, ab jetzt werde ich es tun, danke für den Tipp –

4

Wichtig zu beachten: Sie können XpsDocumentWriter auch verwenden, wenn Sie direkt auf einen physischen Drucker drucken. Machen Sie nicht den Fehler, dass ich es vermieden habe, nur weil Sie keine .xps-Datei erstellen!

Wie auch immer - ich hatte das gleiche Problem, und keiner der DoEvents() Hacks schien zu funktionieren. Ich war auch nicht besonders glücklich darüber, sie überhaupt benutzen zu müssen. In meiner Situation einige der datengebundenen Steuerelemente ausgedruckt, aber einige andere (verschachtelte UserControls) nicht. Es war so, als ob nur eine "Ebene" mit Daten verbunden wäre und der Rest würde selbst mit einem "DoEvents()" - Hack nicht binden.

Die Lösung war jedoch einfach. Verwenden Sie XpsDocumentWriter wie folgt. Es öffnet sich ein Dialog, in dem Sie den installierten physischen Drucker auswählen können.

 // 8.5 x 11 paper 
     Size sz = new Size(96 * 8.5, 96 * 11); 

     // create your visual (this is a WPF UserControl) 
     var template = new PackingSlipTemplate() 
     { 
      DataContext = new PackingSlipViewModel(order) 
     }; 

     // arrange 
     template.Measure(sz); 
     template.Arrange(new Rect(sz)); 
     template.UpdateLayout(); 

     // print to XpsDocumentWriter 
     // this will open a dialog and you can print to any installed printer 
     // not just a 'virtual' .xps file 
     PrintDocumentImageableArea area = null; 
     XpsDocumentWriter xps = PrintQueue.CreateXpsDocumentWriter(ref area,); 

     xps.Write(template); 

fand ich das Buch OReilly auf ‚Programming WPF‘ ganz mit dem Kapitel über Printing - found through Google Books nützlich.


Wenn Sie erscheinen nicht ein Druckdialog wollen, wollen aber direkt an den Standarddrucker drucken Sie Folgendes ausführen können. (Für mich besteht die Anwendung darin, Packzettel in einer Lagerumgebung auszudrucken - und ich möchte nicht, dass jedes Mal ein Dialog erscheint).

 var template = new PackingSlipTemplate() 
     { 
      DataContext = new PackingSlipViewModel(orders.Single()) 
     }; 

     // arrange 
     template.Measure(sz); 
     template.Arrange(new Rect(sz)); 
     template.UpdateLayout(); 

     LocalPrintServer localPrintServer = new LocalPrintServer(); 
     var defaultPrintQueue = localPrintServer.DefaultPrintQueue; 

     XpsDocumentWriter xps = PrintQueue.CreateXpsDocumentWriter(defaultPrintQueue); 
     xps.Write(template, defaultPrinter.DefaultPrintTicket); 
+0

Hatte ein ähnliches Problem und das tat behebe das Problem nicht. –

Verwandte Themen