Обнаруживать, когда PrintDocument успешно печатает (не просто просматривается)
Я использую специальную печать, используя PrintDocument в своем приложении. У меня есть требование регистрации, когда наши товары успешно печатаются. Я изначально достигал этого с чем-то вроде:
print_doc.EndPrint += (o,e) => printed_callback ();
Чтобы сделать мой printed_callback
доступным при завершении печати. Однако теперь, когда я добавляю поддержку предварительного просмотра, я передаю PrintDocument
, построенный точно таким же образом, в PrintPreviewDialog. Это приводит к тому, что событие EndPrint
вызывается после первоначальной рендеринга распечатки, необходимой для предварительного просмотра.
В результате, даже если пользователь нажимает "Предварительный просмотр", а затем просто закрывает предварительный просмотр, вызывается наш код регистрации.
Любые предложения о том, как отличить реальную распечатку и "предварительную печать"? К сожалению, я не могу просто не подключиться к EndPrint
для PrintDocument
, переданного в PrintPreviewDialog
, так как пользователь может нажать кнопку "Печать" в диалоговом окне предварительного просмотра и запустить распечатку.
Ответы
Ответ 1
Хорошо, поэтому мне действительно удалось это выяснить, используя свойство PrintDocument.PrintController и проверив свойство IsPreview
контроллера. Мой окончательный код закончился следующим образом:
doc.EndPrint += (o,e) =>
{
if (doc.PrintController.IsPreview)
return;
print_callback ();
}
Ответ 2
Мне тоже удалось разобраться с другим способом, который сработал у меня...
У меня был список классов MyPrintFileDetail, каждый из которых содержал PrintDocument и StreamReader для указанного документа.
При настройке моего PrintDocument я добавил событие PrintPage. В обработчике событий PrintPage я определил, с каким PrintDocument я работал с помощью отправки "отправителя" в PrintDocument. Затем написал цикл foreach, чтобы идентифицировать рабочий объект MyPrintFileDetail из списка, чтобы использовать StreamReader, который я использовал для печати. Когда линий больше не было, я удалил StreamReader и установил его в null.
Затем в моем обратном вызове Timer для обработки списка объектов MyPrintFileDetail я проверил StreamReader для null и, если null, я сделал печать.
Вид неудобный, но он сработал.
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;
}
}