WebBrowser文档已完成事件C#

下面是我用作浏览器的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事件处理程序上的任何内容都会被执行两次。 有人可以帮助我让它只执行一次吗?

我记得,如果导航到的文档包含嵌入其他网页的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(browser, "DocumentCompleted") docCompleted .Take(1) // Take only one event firing .Subscribe(i => MessageBox.Show(browser.Url.ToString())); browser.Navigate("http://www.google.com"); } 

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