如何检测System.Windows.Forms.WebBrowser控件何时加载完成?
我尝试使用Navigate和DocumentCompleted事件,但它们在文档加载期间都会被多次引发!
如何检测System.Windows.Forms.WebBrowser控件何时加载完成?
我尝试使用Navigate和DocumentCompleted事件,但它们在文档加载期间都会被多次引发!
我认为DocumentCompleted
事件也会触发所有子文档的加载(例如JS和CSS)。您可以查看DocumentCompleted
中的WebBrowserDocumentCompletedEventArgs
,并检查Url属性,将其与主页面的Url进行比较。
我做了以下操作:
void BrowserDocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
return;
//The page is finished loading
}
通常最后加载的页面是被导航到的页面,所以这应该可以解决问题。
来自这里。
BrowserDocumentCompleted(sender, e);
。 - Aveprivate void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
//Check if page is fully loaded or not
if (this.webBrowser1.ReadyState != WebBrowserReadyState.Complete)
return;
else
//Action to be taken on page loading completion
}
如果存在下载管理器并且导航到可下载文件时,readystate方法存在问题,导航可能会被下载管理器取消,从而使读取状态无法变为完成。
DocumentCompleted
事件的问题,尝试了以上所有建议。最终,在我的情况下,既不是IsBusy
属性正常工作,也不是Url
属性,而是ReadyState
似乎是我需要的,因为在加载多个框架时它具有“交互”状态,并且只有在加载最后一个框架后才获得“完成”状态。因此,我知道页面已经完全加载了所有组件。
希望这也能帮助其他人 :)
似乎对于外部JavaScript或CSS文件不会触发DocumentCompleted / Navigated事件,但对于iframe则会触发。根据PK的说法,比较WebBrowserDocumentCompletedEventArgs.Url属性(我还没有评论的权限)。
LoadCompleted
事件。Windows.Forms
,则DocumentCompleted
事件应该是正确的。如果您加载的页面具有框架,则您的WebBrowser
控件将为每个框架触发DocumentCompleted
事件(有关更多详细信息,请参见此处)。建议每次事件被触发时检查IsBusy
属性,如果为false,则您的页面已完全加载完成。您可以使用 ProgressChanged 事件;它最后一次被引发时将指示文档已完全呈现:
this.webBrowser.ProgressChanged += new
WebBrowserProgressChangedEventHandler(webBrowser_ProgressChanged);
使用DocumentCompleted事件处理带有多个嵌套框架的页面对我无效。
我使用Interop.SHDocVW库将WebBrowser控件进行了转换,如下所示:
public class webControlWrapper
{
private bool _complete;
private WebBrowser _webBrowserControl;
public webControlWrapper(WebBrowser webBrowserControl)
{
_webBrowserControl = webBrowserControl;
}
public void NavigateAndWaitForComplete(string url)
{
_complete = false;
_webBrowserControl.Navigate(url);
var webBrowser = (SHDocVw.WebBrowser) _webBrowserControl.ActiveXInstance;
if (webBrowser != null)
webBrowser.DocumentComplete += WebControl_DocumentComplete;
//Wait until page is complete
while (!_complete)
{
Application.DoEvents();
}
}
private void WebControl_DocumentComplete(object pDisp, ref object URL)
{
// Test if it's the main frame who called the event.
if (pDisp == _webBrowserControl.ActiveXInstance)
_complete = true;
}