WebBrowser文档已完成事件C#

时间:2012-08-01 16:03:40

标签: c# webbrowser-control

以下是我用作浏览器“DocumentCompleted”事件的函数,以及负责创建Web浏览器并导航到特定网址的navBtnClick()方法。

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");后,会有一个消息框正确显示该网址,然后一段时间后,另一个消息框显示相同的网址。所以,发生的事情是,DocumentCompleted事件处理程序上的任何内容都会被执行两次。有人可以帮助我让它只执行一次吗?

2 个答案:

答案 0 :(得分: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");
}

答案 1 :(得分:1)

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