Настройка ориентации страницы для Wpf DocumentViewer PrintDialog - PullRequest
17 голосов
/ 16 июня 2009

Использование элемента управления Wpf DocumentViewer Я не могу понять, как настроить PageOrientation для PrintDialog, который DocumentViewer отображает, когда пользователь нажимает кнопку печати. Есть ли способ подключиться к этому?

Ответы [ 2 ]

16 голосов
/ 14 января 2010

Майк отвечает работает. Вместо этого я решил создать свой собственный просмотрщик документов, полученный из 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);
        }
    }
}
10 голосов
/ 01 июля 2009

Обходной путь, который я использовал для установки ориентации в диалоговом окне печати моего 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;
    }
...