2009-11-04 28 views
6

グリーティング、 WPFでの印刷に問題があります。 私はフロードキュメントを作成し、そのフロードキュメントにいくつかのコントロールを追加しています。 印刷プレビューは正常に動作し、印刷プレビューウィンドウからの印刷に問題はありません。 印刷プレビューなしでプリンタに直接印刷するときに問題が発生します。しかし、もっと驚くべきことに、XPS Document Writerをプリンタとして使用すると、はすべて正常です。物理プリンタを使用すると、フロードキュメントの一部のコントロールが表示されません。 事前のおかげでWPF印刷フロードキュメント

+4

挨拶、 私が解決したproblem.Iが結合してプリンタにドキュメントを送信すると、非同期操作していることがわかりました。そこで私はBeaStolnitzの記事に基づいてWPFでAppliaction.DoEvents()を作成しました。これで問題は解決しました http://bea.stollnitz.com/blog/index.php?s=doevents –

+0

上記のコメントのリンクは機能しなくなりましたが、リダイレクト先のサイトを掘り下げてDoEventsアプローチの記事:http://www.zagstudio.com/blog/493#.UegOCo1dyaI –

答えて

1

XPS Documentは、私は一つのことに気づいた問題

0

せずに印刷することができます。 ヒント:表示されていないコントロールは、私はいくつかのデータを結合していますコントロールですので、結論はということですがバインディングは機能しません。ドキュメントをプリンタに送信する前にバインディングが実行されていない場合がありますか?

+0

Peter、Stackoverflowの使い方のヒント - 情報を追加する場合は、元の質問を編集し、「回答」は投稿しないでください。一般的に、特定の回答に返答したい場合は、コメントを使用してください(ただし、あなたがまだできない場合を除きます)。 – Murph

+0

ok、今から私はチップにお礼を言います –

4

メモする重要なこと:物理プリンタに直接印刷する場合でもXpsDocumentWriterを使用できます。 .xpsファイルを作成していないからといって、私がやった間違いを避けてください!

とにかく - 私はこの同じ問題を抱えており、DoEvents()のハックのどれも動作していないようです。私はまた、最初にそれらを使用しなければならないことについて特に満足していませんでした。私の状況では、いくつかのデータバインドされたコントロールはうまくいきましたが、他のもの(ネストされたUserControls)はうまくいきませんでした。あたかも1つの 'レベル'しかデータバインドされておらず、残りの部分はDoEvents()のハックでもバインドされないようです。

解決策は簡単でした。このようにXpsDocumentWriterを使用します。どの物理プリンタがインストールされているかを選択できるダイアログが開きます。

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

私はPrinting - found through Google Booksにその章と「Programming WPF」に関するOReilly帳は非常に有用であることが判明。


印刷ダイアログが表示されないようにするには、デフォルトのプリンタに直接印刷する場合は、次の操作を行います。 (私の場合、アプリケーションは倉庫環境で梱包用紙を印刷することです - 毎回ダイアログが表示されることはありません)。

 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

同様の問題がありました。問題を修正しないでください。 –