Search code examples
wpfvb.netie-automation

Internet Explorer instance DocumentComplete not firing


I am trying to create an instance of Internet Explorer from a WPF application, load a saved local file, and do some further processing once the file is loaded. However, although the file is visible in the Internet Explorer window, the DocumentComplete event never fires:

'static field
Dim iex As ShDocVw.InternetExplorer

Public Sub DoStuff()
    Dim path = "c:\test.htm"
    iex = New SHDocVw.InternetExplorer
    iex.Visible = True
    AddHandler iex.DocumentComplete, Sub(o As Object, ByRef url As Object)
            'This code is never executed
            Dim i = 5
        End Sub
    iex.Navigate2(path)
End Sub

When I navigate to a non-local URL (e.g. http://www.google.com) the DocumentComplete event does fire.

The same behavior exists for the NavigateComplete2 event.

I tried using a class member method instead of a lambda expression (maybe the lambda expression is going out of scope once the method exits?) using both AddressOf and Handles, but that didn't help.

What do I have to do to have the DocumentComplete event fire?

(NB: The page has no frames.)

Update

This code is being used in a class library, and I therefore cannot use the WebBrowser control, as it cannot be instantiated in code.

As SimonMourier points out in the comments, a WebBrowser can be instantiated in code:

Dim wb = New WebBrowser
AddHandler wb.LoadCompleted, Sub(s, e)
    Dim i = 5
End Sub
wb.Navigate(path)

Although the LoadCompleted event still doesn't fire, the Navigated event does, and it appears to be sufficient for my purposes. (Apparently the WebBrowser has to be visible in order for LoadCompleted to fire -- see here and here -- and since I am not using the WebBrowser in the context of a window, I don't think this is even possible in my case.)


Solution

  • You should use the out-of-the-box standard WebBrowser Control that ships with WPF (there is another one for Winforms apps). It has all the basic events directly supported.

    Should you miss some Winforms feature like IsWebBrowserContextMenuEnabled or ScriptErrorsSuppressed, I suggest you refer to my answer in this question on SO: How to deactivate "right click" on WPF Webbrowser Control?

    You only need interop in these special cases or if you need to get ahold on the native underlying IE's Document Object Model (DOM), interfaces like IHTMLDocument2, etc.