3

下面是我用作浏览器DocumentCompleted事件的函数,也是navBtnClick()负责创建 Web 浏览器并导航到特定 url 的方法。

public void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {

                MessageBox.Show( ((WebBrowser)sender).Url.ToString() );

}



private void navBtnClick(object sender, EventArgs e)
{
            WebBrowser wbrowser = new WebBrowser();
            wbrowser.DocumentCompleted +=new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted);
            wbrowser.Navigate("http://www.google.com");

}

现在执行此行后wbrowser.Navigate("http://www.google.com");,会出现一个正确显示 url 的消息框,然后稍后会显示另一个具有相同 url 的消息框。所以,发生的事情是,无论DocumentCompleted事件处理程序上的什么,都会被执行两次。有人可以帮我让它只执行一次吗?

4

2 回答 2

7

我记得,如果要导航到的文档具有嵌入其他网页的 iframe,则 DocumentCompleted 将触发多次。

如果您只想接收一次事件,只需取消订阅 DocumentCompleted 处理程序:

public void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{
   var webBrowser = sender as WebBrowser;
   webBrowser.DocumentCompleted -= WebBrowser_DocumentCompleted;
   MessageBox.Show(webBrowser.Url.ToString() );
}    

private void navBtnClick(object sender, EventArgs e)
{
     var wbrowser = new WebBrowser();
     wbrowser.DocumentCompleted +=new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted);
     wbrowser.Navigate("http://www.google.com");
}

或者,您可以使用 System.IObservable 和ReactiveExtensions来订阅一个事件触发:

private void navBtnClick(object sender, EventArgs e)
{
     var browser = new WebBrowser();
     var docCompleted = Observable.FromEventPattern<WebBrowserDocumentCompletedEventArgs>(browser, "DocumentCompleted")
     docCompleted
         .Take(1) // Take only one event firing
         .Subscribe(i => MessageBox.Show(browser.Url.ToString()));

     browser.Navigate("http://www.google.com");
}
于 2012-08-01T16:35:19.970 回答
1

对我来说,http://www.google.com重定向到http://www.google.ca。如果您发生类似的事情,您可能会为这两个文档中的每一个获取文档完成事件。尝试输出/跟踪WebBrowserDocumentCompletedEventArgs.Url以查看完成的文档。

于 2012-08-01T16:31:43.950 回答