Добавить обработчик событий для завершения задания печати
Я пытаюсь понять, как добавить обработчик событий для задания печати в моем приложении С#. Я хочу произвести обратный отсчет после завершения задания печати и обновить пользовательский интерфейс, указав новое значение. Я попытался добавить обработчик событий для _printDocument.EndPrint, но обработчик не сработал. Я также попробовал подписаться на событие JobCompleted класса PrintQueue, но это тоже не сработало.
Я не уверен, что делаю неправильно и какие у меня есть еще варианты достижения цели. Может ли кто-нибудь помочь мне устранить эту проблему или предложить другой подход к подсчету очереди заданий печати в режиме реального времени? Любая помощь будет принята с благодарностью. Спасибо.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Printing;
using System.Drawing;
using System.Drawing.Printing;
namespace ShowPrintButtonWithPrintoutCount
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private PrintDocument _printDocument;
private static string localPrinterName = "NPI03F0E5";
private PrintQueue _printQueue = new PrintQueue(new PrintServer(), localPrinterName);
public MainWindow()
{
InitializeComponent();
// Set the printer image to "printerReady.png"
PrinterImage.Source = new BitmapImage(new System.Uri("c:/ResourcesTest/printerReady.png", System.UriKind.RelativeOrAbsolute));
// Get the print queue for the default printer
PrintServer printServer = new PrintServer();
_printQueue = printServer.GetPrintQueue("\\\\localhost\\"+ localPrinterName);
// Subscribe to the EndPrint event
_printDocument = new PrintDocument();
_printDocument.EndPrint += new System.Drawing.Printing.PrintEventHandler(PrintJobCompleted);
// Update the queued jobs count and print count text
UpdatePrintCountText();
}
private void PrintButton_Click(object sender, RoutedEventArgs e)
{
// Change the printer image to "busy.png"
PrinterImage.Source = new BitmapImage(new System.Uri("c:/ResourcesTest/printerBusy.png", System.UriKind.RelativeOrAbsolute));
// Print the document
PrintDocument();
// Update the queued jobs count and print count text
UpdatePrintCountText();
}
private void PrintDocument()
{
// TODO: Print the document here
_printDocument.PrinterSettings.PrinterName = localPrinterName;
_printDocument.PrintPage += (sender, e) =>
{
System.Drawing.Image image = System.Drawing.Image.FromFile("c:/ResourcesTest/image.jpg");
e.Graphics.DrawImage(image, e.MarginBounds);
};
_printDocument.Print();
}
private void PrintJobCompleted(object sender, System.Drawing.Printing.PrintEventArgs e)
{
// Update the queued jobs count and print count text
UpdatePrintCountText();
}
private void UpdatePrintCountText()
{
// Get the number of queued jobs
int printJobCount = GetPrintJobCount(localPrinterName);
if (printJobCount > 0)
{
// Update the print count text
PrintCountText.Text = printJobCount.ToString();
}
else
{
// Update the print count text
PrintCountText.Text = "0";
PrinterImage.Source = new BitmapImage(new System.Uri("c:/ResourcesTest/printerReady.png", System.UriKind.RelativeOrAbsolute));
}
}
private int GetPrintJobCount(string printerName)
{
using (PrintServer printServer = new PrintServer())
{
PrintQueue printQueue = printServer.GetPrintQueue(printerName);
return printQueue.GetPrintJobInfoCollection().Count();
}
}
}
}
КСАМЛ:
<Window x:Class="ShowPrintButtonWithPrintoutCount.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Print Status" Height="200" Width="400">
<Grid>
<Button Background="Transparent" BorderThickness="0" Click="PrintButton_Click">
<Grid>
<Image x:Name="PrinterImage" Source="c:/ResourcesTest/printerReady.png" Width="24" Height="24" Margin="10"/>
<Canvas>
<Ellipse Fill="Gray" Width="20" Height="20"/>
<TextBlock x:Name="PrintCountText" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="12"/>
</Canvas>
</Grid>
</Button>
</Grid>
</Window>