Определите, когда PrintDocument успешно печатает (а не только просматривает) - PullRequest
11 голосов
/ 07 июня 2011

Я выполняю пользовательскую печать, используя PrintDocument в моем приложении. У меня есть требование регистрации, когда наши пункты успешно напечатаны. Я изначально достиг этого с помощью чего-то вроде:

 print_doc.EndPrint += (o,e) => printed_callback ();

Чтобы мои printed_callback были вызваны после завершения печати. Однако теперь, когда я добавляю поддержку предварительного просмотра, я передаю PrintDocument, построенный точно таким же образом, в PrintPreviewDialog . Это приводит к тому, что событие EndPrint вызывается после начальной визуализации распечатки, необходимой для предварительного просмотра.

В результате, даже если пользователь нажимает «Предварительный просмотр», а затем просто закрывает предварительный просмотр, вызывается наш код регистрации.

Какие-либо предложения о том, как провести различие между реальной распечаткой и "предварительным распечатыванием"? К сожалению, я не могу просто не подключить EndPrint для PrintDocument, переданного PrintPreviewDialog, так как пользователь может нажать кнопку «Печать» в диалоговом окне предварительного просмотра и запустить распечатку.

Ответы [ 2 ]

14 голосов
/ 07 июня 2011

Хорошо, так что мне действительно удалось выяснить это самостоятельно, используя свойство PrintDocument.PrintController и проверив свойство IsPreview контроллера.Мой окончательный код закончился следующим образом:

doc.EndPrint += (o,e) =>
{
    if (doc.PrintController.IsPreview)
        return;

    print_callback ();
}
0 голосов
/ 19 июня 2015

Мне тоже удалось выяснить другой способ, который работал для меня ...

У меня был список классов MyPrintFileDetail, каждый из которых содержал PrintDocument и StreamReader для указанного документа.

При настройке моего PrintDocument я добавил событие PrintPage. В обработчике события PrintPage я определил, с каким PrintDocument я работал, путем приведения «отправителя» в PrintDocument. Затем написал цикл foreach для определения рабочего объекта MyPrintFileDetail из списка, чтобы получить StreamReader, который я использовал для печати. Когда больше не было строк для печати, я удалил StreamReader и установил его на нуль.

Затем в обратном вызове Timer для обработки списка объектов MyPrintFileDetail я проверил StreamReader на наличие нуля и, если он пуст, я закончил печать.

Вид неуклюжий, но это сработало.

    private void PD_PrintPage(object sender, PrintPageEventArgs e)
    {
        PrintDocument p = (PrintDocument)sender;

        PrintFileDetail pfdWorkingOn = null;

        foreach (PrintFileDetail pfd in pfds)
        {
            if (pfd._PrintDoc.DocumentName == p.DocumentName)
            {
                pfdWorkingOn = pfd;
                break;
            }
        }

        float yPos = 0f;
        int count = 0;
        float leftMargin = e.MarginBounds.Left;
        float topMargin = e.MarginBounds.Top;
        string line = null;
        float linesPerPage = e.MarginBounds.Height / _TextFilePrintingFont.GetHeight(e.Graphics);

        while (count < linesPerPage)
        {
            line = pfdWorkingOn._TxtFileBeingPrinted.ReadLine();
            if (line == null)
            {
                break;
            }
            yPos = topMargin + count * _TextFilePrintingFont.GetHeight(e.Graphics);
            e.Graphics.DrawString(line, _TextFilePrintingFont, Brushes.Black, leftMargin, yPos, new StringFormat());
            count++;
        }

        if (line != null)
        {
            e.HasMorePages = true;
        }
        else
        {
            pfdWorkingOn._TxtFileBeingPrinted.Dispose();
            pfdWorkingOn._TxtFileBeingPrinted = null;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...