Configuración de la orientación de la página para el WPF DocumentViewer PrintDialog
(2)
Al usar el control DocumentViewer de Wpf, no puedo averiguar cómo configurar la orientación de página en el PrintDialog que el DocumentViewer muestra cuando el usuario hace clic en el botón de impresión. ¿Hay una manera de engancharse en esto?
La solución que utilicé para establecer la orientación en el diálogo de impresión de mi DocumentViewer fue ocultar el botón de impresión en el control DocumentViewer omitiendo el botón de la plantilla. Luego proporcioné mi propio botón de impresión y lo até al siguiente código:
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;
}
La respuesta de Mike funciona. La forma en que elegí implementarlo fue en cambio crear mi propio visor de documentos derivado de DocumentViewer. Además, la conversión de la propiedad Document en FixedDocument no funcionaba para mí, la conversión en FixedDocumentSequence sí lo estaba.
GetDesiredPageOrientation es lo que necesitas que sea. En mi caso, estoy inspeccionando las dimensiones de la primera página, porque genero documentos que son de tamaño y orientación uniformes para todas las páginas del documento, y con solo un documento en la secuencia.
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);
}
}
}