簡體   English   中英

WPF DocumentViewer 覆蓋打印按鈕

[英]WPF DocumentViewer override Print button

我已經使用自定義 DocumentViewer(如下所示)在我的應用程序中實現了打印預覽功能。 我在顯示預覽之前調用PrintDialog.ShowDialog()以便根據紙張方向正確創建文檔。

然而,DocumentViewer 打印按鈕調用PrintDialog.ShowDialog()提示用戶再次選擇打印機和選項(他們在預覽窗口打開之前已經這樣做了)。

有沒有辦法讓 DocumentViewer 打印按鈕簡單地打印而不調用PrintDialog.ShowDialog()

這是我的方法調用:

報表視圖模型.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));
        ...
    }

我這樣做是為了我可以正確生成具有縱向或橫向尺寸值的分頁器。 如果沒有這個,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();
       }
   }

您可以填寫打印機和紙張尺寸屬性,然后不顯示對話框。

var pd = new PrintDialog();
pd.PrintTicket.PageMediaSize = new PageMediaSize(PageMediaSizeName.NorthAmericaLetter, 816.0, 1056.0);
pd.PrintQueue = new LocalPrintServer().GetPrintQueue("Microsoft Print to PDF");

要覆蓋Print命令:

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

打印按鈕不容易被覆蓋,但我找到了一種方法。 即使它可能被認為是一個骯臟的黑客,最終重要的是結果。

我只是用一個不可見的按鈕覆蓋了打印按鈕(無論如何這是第一個按鈕),該按鈕將點擊重定向到我自己的打印功能。 在此示例代碼中,搜索工具欄也被隱藏並且 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>

我希望您現在已經解決了這個問題,但是您可以使用這個問題作為修改 DocumentViewer 控件模板的基礎:

如何隱藏 WPF DocumentViewer 的菜單欄?

有一個指向 MSDN 文章的鏈接,它應該向您展示如何修改模板,以便打印按鈕執行您想要的操作,而不是默認的打印操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM