2009-11-04 35 views
6

Saludos, Tengo un problema con la impresión en WPF. Estoy creando un documento de flujo y agrego algunos controles a ese documento de flujo. Vista previa de impresión funciona bien y no tengo ningún problema con la impresión desde una ventana de vista previa de impresión. El problema existe cuando imprimo directamente en la impresora sin una vista previa de impresión. Pero lo que es más sorprendente: cuando uso XPS Document Writer como impresora todo está bien, cuando uso alguna impresora física, algunos controles en mi documento de flujo no se muestran. Gracias de antemanoWPF Printing Flow Documento

+4

Saludos, he resuelto el problem.I encontró que la unión y el envío de documentos a la impresora son de forma asincrónica operaciones. Así que hice un Appliaction.DoEvents() equivalente en WPF basado en el artículo de BeaStolnitz. Esto resolvió el problema http://bea.stollnitz.com/blog/index.php?s=doevents –

+0

El enlace en el comentario anterior ya no funciona, pero indagar en el sitio al que redirige me llevó a un artículo con el enfoque DoEvents: http://www.zagstudio.com/blog/493#.UegOCo1dyaI –

Respuesta

1

documentos XPS se puede imprimir sin problemas

0

he dado cuenta de una cosa: consejo: los controles que no se muestran son los controles estoy fuerza obligatoria algunos datos, por lo que la conclusión es que la el enlace no funciona ¿Puede ser que el enlace no se esté ejecutando antes de enviar el documento a la impresora?

+0

Peter, un consejo de uso para Stackoverflow: si desea agregar información, debe editar su pregunta original, no publicar "respuestas". En general, si desea responder a una respuesta en particular, use un comentario (¡mmm, excepto que tal vez no pueda!) – Murph

+0

bien, desde ahora lo haré, gracias por la sugerencia –

4

Lo importante a tener en cuenta: Puede usar XpsDocumentWriter incluso cuando imprima directamente en una impresora física. ¡No cometa el error que cometí al evitarlo solo porque no está creando un archivo .xps!

De todos modos, tuve el mismo problema, y ​​ninguno de los hacks DoEvents() parecía funcionar. Además, no estaba muy contento de tener que usarlos en primer lugar. En mi situación, algunos de los controles de datos impresos bien, pero algunos otros (UserControls anidados) didnt. Era como si solo un 'nivel' estuviera siendo enlazado a datos y el resto no se uniría incluso con un 'DoEvents()' piratear.

La solución fue simple. Use XpsDocumentWriter de esta manera. abrirá un cuadro de diálogo en el que puede elegir la impresora física instalada que desee.

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

encontré el libro de OReilly en 'Programming WPF' bastante útil con su capítulo sobre Printing - found through Google Books.


Si no desea que aparezca un cuadro de diálogo de impresión, pero desea imprimir directamente a la impresora predeterminada, puede hacer lo siguiente. (Para mí, la aplicación es para imprimir hojas de embalaje en un entorno de almacén, y no quiero que aparezca un cuadro de diálogo cada vez).

 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

Tuve un problema similar y esto hizo no arregla el problema –