こんにちは、WPF での印刷に問題があります。フロー ドキュメントを作成しており、そのフロー ドキュメントにいくつかのコントロールを追加しています。印刷プレビューは問題なく動作し、印刷プレビュー ウィンドウからの印刷に問題はありません。印刷プレビューなしでプリンターに直接印刷すると、問題が発生します。しかし、さらに驚くべきことに、XPS Document Writer をプリンターとして使用すると、物理的なプリンターを使用すると、フロー ドキュメントの一部のコントロールが表示されなくなります。前もって感謝します
3 に答える
注意すべき重要事項:物理プリンターに直接印刷する場合でも、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);
「プログラミング WPF 」に関する OReilly の本は、Google ブックスで見つけた印刷に関する章で非常に役に立ちました。
印刷ダイアログを表示したくないが、デフォルトのプリンターに直接印刷したい場合は、次の操作を実行できます。(私にとってのアプリケーションは、倉庫環境で梱包明細を印刷することです。毎回ダイアログがポップアップするのは望ましくありません)。
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);
XPSドキュメントは問題なく印刷できます
ヒント: 表示されていないコントロールは、データをバインドしているコントロールなので、バインドが機能しないという結論に達しました。ドキュメントをプリンタに送信する前に製本が実行されていない可能性はありますか?