【问题标题】:Setting PageOrientation for the Wpf DocumentViewer PrintDialog为 Wpf DocumentViewer PrintDialog 设置 PageOrientation
【发布时间】:2010-11-03 11:11:31
【问题描述】:

使用 Wpf DocumentViewer 控件我不知道如何在用户单击打印按钮时 DocumentViewer 显示的 PrintDialog 上设置 PageOrientation。有没有办法解决这个问题?

【问题讨论】:

    标签: wpf documentviewer printdialog


    【解决方案1】:

    Mike's answer 有效。我选择实现它的方式是创建我自己的从 DocumentViewer 派生的文档查看器。此外,将 Document 属性转换为 FixedDocument 对我不起作用 - 转换为 FixedDocumentSequence 是。

    GetDesiredPageOrientation 是您需要的任何东西。就我而言,我正在检查第一页的尺寸,因为我为文档中的所有页面生成了统一大小和方向的文档,并且序列中只有一个文档。

    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,因为它包含非 l18n 友好的文本,因此这是一个很好的解决方案。谢谢!
    • 应该是printDialog.PrintTicket = printDialog.PrintQueue.DefaultPrintTicket;?否则不编译
    • 很高兴看到您的 GetDesiredPageOrientation 实现!
    • 已注明并已修复。谢谢。另外:gist.github.com/mcw0933/5543526 只需调用 GetPageOrientationOfFirstPageOfFixedDocSeq。
    【解决方案2】:

    我用来在 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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 2023-03-16
      • 1970-01-01
      • 2014-10-14
      相关资源
      最近更新 更多