Setting PageOrientation for the Wpf DocumentViewer PrintDialog
Mike's answer works. The way I chose to implement it was to instead create my own doc viewer derived from DocumentViewer. Also, casting the Document property to FixedDocument wasn't working for me - casting to FixedDocumentSequence was.
GetDesiredPageOrientation is whatever you need it to be. In my case, I'm inspecting the first page's dimensions, because I generate documents that are uniform size and orientation for all pages in the document, and with only one doc in the sequence.
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); } }}
The workaround I used to set the orientation on my DocumentViewer's print dialog was to hide the print button on the DocumentViewer control by omitting the button from the template. I then provided my own print button and tied it to the following code:
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; }