WPF DocumentViewer重写打印按钮

6
我已经在我的应用程序中使用自定义的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));
        ...
    }

我这样做是为了能够正确生成具有纵向或横向大小值的分页器。如果没有这样做,则文档查看器中的预览文档可能根据所选择的方向无法正确显示。 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();
       }
   }
3个回答

3
您可以填写打印机和纸张大小属性,然后对话框将不会显示。
var pd = new PrintDialog();
pd.PrintTicket.PageMediaSize = new PageMediaSize(PageMediaSizeName.NorthAmericaLetter, 816.0, 1056.0);
pd.PrintQueue = new LocalPrintServer().GetPrintQueue("Microsoft Print to PDF");

如需重写打印命令:

<DocumentViewer>
    <DocumentViewer.CommandBindings>
        <CommandBinding Command="ApplicationCommands.Print" Executed="Print_Executed" />
    </DocumentViewer.CommandBindings>
</DocumentViewer>

1

打印按钮本身不能很容易地被覆盖,但我找到了一种方法来实现。即使这可能被认为是一种不太正规的方法,但最终的结果才是最重要的。

我只是用一个不可见的按钮覆盖了打印按钮(它本来就是第一个按钮),将点击重定向到我的自定义打印函数。在这个示例代码中,搜索工具栏也被隐藏了,并且禁用了Ctrl+P:

<Grid>
    <DocumentViewer x:Name="DocumentViewer">
        <DocumentViewer.Resources>
            <Style TargetType="ContentControl">
                <Style.Triggers>
                    <Trigger Property="Name" Value="PART_FindToolBarHost">
                        <Setter Property="Visibility" Value="Collapsed" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </DocumentViewer.Resources>
        <DocumentViewer.InputBindings>
            <KeyBinding Key="P" Modifiers="Control" Command="ApplicationCommands.NotACommand" />
        </DocumentViewer.InputBindings>
    </DocumentViewer>
    <Button Width="32" Height="32" VerticalAlignment="Top" HorizontalAlignment="Left" Opacity="0.01" Click="OnPrint" ></Button>
</Grid>

0
我希望你现在已经解决了这个问题,但是你可以将这个问题作为修改DocumentViewer控件模板的基础: 如何隐藏WPF DocumentViewer的菜单栏? 有一个链接指向MSDN文章,应该会告诉你如何修改模板,使打印按钮执行你想要的操作而不是默认的打印操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接