The print handler implementation given below shows print dialog before printing the loaded web page.
To learn how to reuse this print handler, please take a look at the corresponding article.
C#
public class DialogPrintHandler : PrintHandler { public PrintStatus OnPrint(PrintJob printJob) { ManualResetEvent waitEvent = new ManualResetEvent(false); PrintDialog dialog = null; Nullable<bool> print = false; PrintSettings settings = printJob.PrintSettings; Application.Current.Dispatcher.BeginInvoke((Action) (() => { dialog = new PrintDialog(); print = dialog.ShowDialog(); if (print != null && print.Value) { settings.PrinterName = dialog.PrintQueue.Name; if (dialog.PageRangeSelection == PageRangeSelection.UserPages) { settings.PageRanges = new List<PageRange>() { new PageRange(dialog.PageRange.PageFrom, dialog.PageRange.PageTo) }; } if (dialog.PrintTicket.CopyCount != null) settings.Copies = dialog.PrintTicket.CopyCount.Value; if (dialog.PrintTicket.Duplexing != null) settings.DuplexMode = (DuplexMode) ((int) dialog.PrintTicket.Duplexing + 1); } waitEvent.Set(); })); waitEvent.WaitOne(); return print != null && print.Value ? PrintStatus.CONTINUE : PrintStatus.CANCEL; } }
VB.NET
Public Class DialogPrintHandler Implements PrintHandler Public Function OnPrint(ByVal printJob As PrintJob) As PrintStatus _ Implements PrintHandler.OnPrint Dim waitEvent As ManualResetEvent = New ManualResetEvent(False) Dim dialog As PrintDialog = Nothing Dim print As Nullable(Of Boolean) = False Dim settings As PrintSettings = printJob.PrintSettings Application.Current.Dispatcher.BeginInvoke(CType((sub() dialog = New PrintDialog() print = dialog.ShowDialog() If print IsNot Nothing AndAlso print.Value Then settings.PrinterName = dialog.PrintQueue.Name If dialog.PageRangeSelection = PageRangeSelection.UserPages Then settings.PageRanges = New List(Of PageRange)() _ From { New PageRange(dialog.PageRange.PageFrom, dialog.PageRange.PageTo) } End If If dialog.PrintTicket.CopyCount IsNot Nothing Then _ settings.Copies = dialog.PrintTicket.CopyCount.Value If dialog.PrintTicket.Duplexing IsNot Nothing Then _ settings.DuplexMode = CType((CInt(dialog.PrintTicket.Duplexing) + 1), DuplexMode) End If waitEvent.Set() End sub), Action)) waitEvent.WaitOne() Return If(print IsNot Nothing AndAlso print.Value, PrintStatus.CONTINUE, PrintStatus.CANCEL) End Function End Class