Wpf DocumentViewer コントロールを使用すると、ユーザーが印刷ボタンをクリックしたときに DocumentViewer が表示する PrintDialog で PageOrientation を設定する方法がわかりません。これにフックする方法はありますか?
18851 次
2 に答える
16
マイクの答えは機能します。私がそれを実装するために選択した方法は、代わりに DocumentViewer から派生した独自のドキュメント ビューアーを作成することでした。また、Document プロパティを FixedDocument にキャストしてもうまくいきませんでした。FixedDocumentSequence へのキャストはうまくいきました。
GetDesiredPageOrientation は、必要なものです。私の場合、最初のページの寸法を調べています。これは、ドキュメント内のすべてのページでサイズと方向が均一で、シーケンス内のドキュメントが 1 つだけのドキュメントを生成するためです。
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Controls;
using System.Windows.Xps;
using System.Printing;
using System.Windows.Documents;
public class MyDocumentViewer : DocumentViewer
{
protected override void OnPrintCommand()
{
// get a print dialog, defaulted to default printer and default printer's preferences.
PrintDialog printDialog = new PrintDialog();
printDialog.PrintQueue = LocalPrintServer.GetDefaultPrintQueue();
printDialog.PrintTicket = printDialog.PrintQueue.DefaultPrintTicket;
// get a reference to the FixedDocumentSequence for the viewer.
FixedDocumentSequence docSeq = this.Document as FixedDocumentSequence;
// set the default page orientation based on the desired output.
printDialog.PrintTicket.PageOrientation = GetDesiredPageOrientation(docSeq);
if (printDialog.ShowDialog() == true)
{
// set the print ticket for the document sequence and write it to the printer.
docSeq.PrintTicket = printDialog.PrintTicket;
XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(printDialog.PrintQueue);
writer.WriteAsync(docSeq, printDialog.PrintTicket);
}
}
}
于 2010-01-14T18:29:38.270 に答える
10
DocumentViewer の印刷ダイアログの向きを設定するために使用した回避策は、テンプレートからボタンを省略して DocumentViewer コントロールの印刷ボタンを非表示にすることでした。次に、独自の印刷ボタンを用意し、それを次のコードに結び付けました。
public bool Print()
{
PrintDialog dialog = new PrintDialog();
dialog.PrintQueue = LocalPrintServer.GetDefaultPrintQueue();
dialog.PrintTicket = dialog.PrintQueue.DefaultPrintTicket;
dialog.PrintTicket.PageOrientation = PageOrientation.Landscape;
if (dialog.ShowDialog() == true)
{
XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(dialog.PrintQueue);
writer.WriteAsync(_DocumentViewer.Document as FixedDocument, dialog.PrintTicket);
return true;
}
return false;
}
于 2009-07-01T11:51:42.583 に答える