Добавить обработчик событий для завершения задания печати

Я пытаюсь понять, как добавить обработчик событий для задания печати в моем приложении С#. Я хочу произвести обратный отсчет после завершения задания печати и обновить пользовательский интерфейс, указав новое значение. Я попытался добавить обработчик событий для _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>

0 ответов

Другие вопросы по тегам