2009-06-16 9 views

Répondre

10

La solution de contournement que j'ai utilisée pour définir l'orientation de la boîte de dialogue d'impression de DocumentViewer consistait à masquer le bouton d'impression sur le contrôle DocumentViewer en omettant le bouton du modèle. Je me suis alors fourni mon propre bouton d'impression et l'attacha au code suivant:

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 œuvres. La façon dont j'ai choisi de l'implémenter était de créer à la place mon propre visualisateur de document dérivé de DocumentViewer. En outre, la conversion de la propriété Document en FixedDocument ne fonctionnait pas pour moi - la conversion en FixedDocumentSequence l'était.

GetDesiredPageOrientation est ce dont vous avez besoin. Dans mon cas, j'inspecte les dimensions de la première page, car je génère des documents de taille et d'orientation uniformes pour toutes les pages du document et avec un seul document dans la séquence.

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); 
     } 
    } 
} 
+0

J'avais déjà remplacé le DocumentViewer par défaut parce qu'il contenait du texte non-l18n-friendly, ce qui s'est avéré être une excellente solution. Merci! – JoeB

+0

Devrait-il être printDialog.PrintTicket = printDialog.PrintQueue.DefaultPrintTicket ;? Ne compile pas autrement –

+0

Serait également agréable de voir votre implémentation de GetDesiredPageOrientation! –

Questions connexes