0

我正在尝试了解有关事件处理的更多信息。我尝试编写下面的代码,但由于某种原因它似乎不起作用。我想要做的是导航到一个 url,等到它加载然后运行 ​​msgbox。

知道我做错了什么吗?

Private Shared event_1 As New AutoResetEvent(False)

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    WebBrowser1.Navigate("http://google.com")
    AddHandler WebBrowser1.DocumentCompleted, New WebBrowserDocumentCompletedEventHandler(AddressOf wb)

    event_1.WaitOne()

    MsgBox("The page is finished loading ")

End Sub

Private Sub wb(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs)
    If e.Url.AbsolutePath <> TryCast(sender, WebBrowser).Url.AbsolutePath Then
        Return
    End If
   event_1.Set()
End Sub
4

2 回答 2

2

您可以像这样在 WebBrowser1 对象上捕获 DocumentCompleted 事件:

Private Sub webBrowser1_DocumentCompleted(ByVal sender As Object, _
    ByVal e As WebBrowserDocumentCompletedEventArgs) _
    Handles webBrowser1.DocumentCompleted

    MsgBox("THe page is loaded")

End Sub

在此处查看示例:http: //msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.aspx ?cs-save-lang=1&cs-lang=vb#code-snippet-2

于 2013-04-30T04:20:42.803 回答
1

当您发出 时event_1.WaitOne(),主线程被阻塞。这包括 WebBrowser。因此,event_1.Set()将永远不会被执行。

但是,您可以使用不同的方法实现相同的行为。不使用任何事件。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Me.Enabled = False ' if you realy want to block the UI as well
    WebBrowser1.Navigate("http://www.google.com")

    Do
      Application.DoEvents()
    Loop Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete

    MsgBox("The page is finished loading ")
    Me.Enabled = True ' re-enable the UI
End Sub
于 2013-04-30T12:02:32.683 回答