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


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;
    }
}