方法:
Navigate()
事件:
Navigating()
Navigated()
DocumentCompleted()
Naviagte()的一个有newWidnow参数的重载用于打开一个默认浏览器窗口并加载目标url,此时这个默认浏览器窗口已独立于WebBrowser
Navigating()的e参数里有个Cancel属性,可用于取消导航操作
Navigated()与DocumentCompleted()的区另在于前者意味着页面数据已加载完毕,后者意味着页面解析完毕,可以作以下试验:
Naviagte一个放置了cnzz计数器(js)的站点,在Navigated里输出DocumentText并Sleep(30000),可以发现DocumentText里包含了目标页的完整html代码,且在Sleep期间,计数器并没有被调用,也就是计数器后台的计数值并没有增加。
Navigate是异步执行的,Webbrowser控件会通过触发DocumentCompleted事件来指示网页加载完毕。但当加载的网页包含frame时比如www.sina.com.cn,可能会多次触发该事
从微软的官方网站上了解到,并非每个frame都对应了一个DocumentCompleted事件,只有触发了Naviagted事件的frame才会有相应的DocumentCompleted事件。另外,最外层的frame总是最后触发DocumentCompleted事件。
以下是常用的三种方法,最后一种计数器方法大概是在Navigated事件中将计数器+1,在DcoumentCompleted中将计数器-1,当计数器==0时,说明目标页面加载并解析完毕。
private void wbs1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { //方法一 if ((sender as WebBrowser).Url == e.Url) Trace.WriteLine("方法一命中"); //方法二 if ((sender as WebBrowser).ReadyState == WebBrowserReadyState.Complete) Trace.WriteLine("方法二命中"); //方法三:计数器...略 }
Navigate方法是异步执行的,以下是单线程情况是的同步解决方案
wbs1.Navigate(txtUrl.Text); do { Application.DoEvents(); }while (wbs1.ReadyState != WebBrowserReadyState.Complete) Trace.WriteLine("页面加载完毕!");
不过建议用信号量解决这类等待操作!