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