Wpf DocumentViewerコントロールを使用すると、ユーザーが印刷ボタンをクリックしたときにDocumentViewerが表示するPrintDialogでPageOrientationを設定する方法がわかりません。これにフックする方法はありますか?Wpf DocumentViewerのPageOrientationを設定するPrintDialog
16
A
答えて
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;
}
15
Mike's answer作品。私がそれを実装する方法は、代わりにDocumentViewerから派生した独自のドキュメントビューアを作成することでした。また、FixedDocumentにDocumentプロパティをキャストしていませんでした - 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);
}
}
}
私はデフォルトのDocumentViewerを既に無効にしていました。なぜなら、それは非公式でないテキストを含んでいるからです。これは素晴らしい解決策であることが判明しました。ありがとう! – JoeB
これは、printDialog.PrintTicket = printDialog.PrintQueue.DefaultPrintTicket ;?そうでなければコンパイルしない –
GetDesiredPageOrientationの実装を見てもいいですか? –