2009-11-04 14 views
6

Pozdrowienia, Mam problem z drukowaniem w WPF. Tworzę dokument przepływu i dodam pewne elementy sterujące do tego dokumentu przepływu. Podgląd wydruku działa poprawnie i nie mam problemu z drukowaniem z okna podglądu wydruku. Problem występuje, gdy drukuję bezpośrednio na drukarce bez podglądu wydruku. Ale co bardziej zaskakujące - kiedy korzystam z XPS Document Writer jako drukarki , wszystko jest w porządku, kiedy używam drukarki fizycznej, niektóre elementy kontrolne w moim dokumencie przepływu nie są wyświetlane. góry dziękiDokument przepływu drukowania WPF

+4

Pozdrowienia, Rozwiązałem problem. Stwierdziłem, że wiązanie i wysyłanie dokumentu do drukarki są operacjami asynchronicznymi. Stworzyłem więc odpowiednik Appliaction.DoEvents() w WPF na podstawie artykułu BeaStolnitz. Rozwiązało to problem: http://bea.stollnitz.com/blog/index.php?s=doevents –

+0

Link w powyższym komentarzu już nie działa, ale przekopywanie się na stronie, która przekierowuje, doprowadziło mnie do artykuł z podejściem DoEvents: http://www.zagstudio.com/blog/493#.UegOCo1dyaI –

Odpowiedz

1

XPS Document można drukować bez problemu

0

zauważyłem jedno: wskazówka: kontrole, które nie są wyświetlane elementy sterujące jestem wiążące jakieś dane, więc wniosek jest taki, że wiązanie nie działa. Czy może się zdarzyć, że wiązanie nie zostanie wykonane przed wysłaniem dokumentu do drukarki?

+0

Peter, wskazówka dotycząca użytkowania dla Stackoverflow - jeśli chcesz dodać informacje, powinieneś edytować swoje oryginalne pytanie, a nie publikować "odpowiedzi". Ogólnie rzecz biorąc, jeśli chcesz odpowiedzieć na konkretną odpowiedź, użyj komentarza (hmm, z tym wyjątkiem, że możesz nie być jeszcze w stanie!) – Murph

+0

ok, od teraz zrobię to, dziękuję za podpowiedź –

4

Ważna informacja: Możesz użyć XpsDocumentWriter nawet podczas drukowania bezpośrednio na fizycznej drukarce. Nie popełnij błędu, którego uniknąłem, tylko dlatego, że nie tworzysz pliku .xps!

W każdym razie - miałem ten sam problem i żaden z haków DoEvents() wydawał się działać. Nie byłem też szczególnie zadowolony z tego, że muszę ich używać. W mojej sytuacji niektóre z kontrolek databound drukowane dobrze, ale niektóre inne (zagnieżdżone UserControls) nie. To było tak, jakby tylko jeden "poziom" był databoundem, a reszta nie wiązałaby się nawet z hackem "DoEvents()".

Rozwiązanie było jednak proste. Użyj XpsDocumentWriter w ten sposób. otworzy okno dialogowe, w którym możesz wybrać dowolną zainstalowaną drukarkę fizyczną.

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

znalazłem książkę oreilly na „Programming WPF” dość przydatny z rozdziału o Printing - found through Google Books.


Jeśli nie chcesz, aby pojawić się okno dialogowe drukowania, ale chcesz wydrukować bezpośrednio na drukarce domyślnej można wykonać następujące czynności. (Dla mnie aplikacja polega na drukowaniu listów przewozowych w środowisku magazynowym - i nie chcę, aby za każdym razem pojawiał się dialog).

 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

Miał podobny problem i to zrobił nie naprawić problemu. –