WPF DocumentViewer覆盖“打印”按钮

Bri*_*nKE 5 c# printing wpf documentviewer

我已经使用自定义DocumentViewer(如下所示)在应用程序中实现了打印预览功能。我PrintDialog.ShowDialog()在显示预览之前先打电话给我,以便根据纸张方向正确创建文档。

但是,DocumentViewer的打印按钮会调用,PrintDialog.ShowDialog()提示用户再次选择打印机和选项(在打开预览窗口之前,他们已经这样做了)。

有没有一种方法可以让DocumentViewer打印按钮简单地打印而无需调用PrintDialog.ShowDialog()

这是我的方法调用:

ReportViewModel.cs

    public void PrintButtonClick(DataGrid dataGrid)
    {
        PrintDialog printDialog = new PrintDialog();
        if (printDialog.ShowDialog() == false)
            return;

        // Get page size based on print dialog printable area (orientation)
        Size pageSize = new Size(printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight);

        // create new paginator for datagrid
        DataGridDocumentPaginator paginator = new DataGridDocumentPaginator(dataGrid as DataGrid, "Employer Match Report", pageSize, new Thickness(30, 20, 30, 20));
        ...
    }
Run Code Online (Sandbox Code Playgroud)

我这样做是为了正确生成纵向或横向尺寸值的分页器。否则,基于所选的方向,DocumentViewer中的预览文档可能无法正确显示。

PrintDocumentViewer:DocumentViewer

   protected override void OnPrintCommand()
   {
       PrintDialog printDialog = new PrintDialog();
       printDialog.PrintQueue = LocalPrintServer.GetDefaultPrintQueue();
       printDialog.PrintTicket = printDialog.PrintQueue.DefaultPrintTicket;

       printDialog.PrintTicket.PageOrientation = PageOrientation;
       // Code assumes this.Document will either by a FixedDocument or a FixedDocumentSequence
       FixedDocument fixedDocument = this.Document as FixedDocument;
       FixedDocumentSequence fixedDocumentSequence = this.Document as FixedDocumentSequence;

       if (fixedDocument != null)
           fixedDocument.PrintTicket = printDialog.PrintTicket;

       if (fixedDocumentSequence != null)
           fixedDocumentSequence.PrintTicket = printDialog.PrintTicket;

       XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(printDialog.PrintQueue);

       if (fixedDocument != null)
           writer.WriteAsync(fixedDocument, printDialog.PrintTicket);

       if (fixedDocumentSequence != null)
           writer.WriteAsync(fixedDocumentSequence, printDialog.PrintTicket);

       // Create Preview Window and show preview
       string s = _previewWindowXaml;
       using (var reader = new System.Xml.XmlTextReader(new StringReader(s)))
       {
           Window preview = System.Windows.Markup.XamlReader.Load(reader) as Window;

           DocumentViewer _docViewer = LogicalTreeHelper.FindLogicalNode(preview, "PrintDocumentViewer") as DocumentViewer;
           _docViewer.Document = (fixedDocument != null) ? fixedDocument as IDocumentPaginatorSource : fixedDocumentSequence as IDocumentPaginatorSource;

           // hide the search bar in the PrintPreview dialog
           ContentControl cc = _docViewer.Template.FindName("PART_FindToolBarHost", _docViewer) as ContentControl;
           cc.Visibility = Visibility.Collapsed;

           preview.ShowDialog();
       }
   }
Run Code Online (Sandbox Code Playgroud)

mag*_*eos 0

我希望您现在已经解决了这个问题,但是您也许可以使用这个问题作为修改 DocumentViewer 控件模板的基础:

如何隐藏 WPF DocumentViewer 的菜单栏?

有一个 MSDN 文章的链接,该文章应该向您展示如何修改模板,以便打印按钮执行您想要的操作,而不是默认的打印操作。