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