Я исследовал этот материал, и все, кажется, соглашаются, что решение состоит в том, чтобы проверить ReadyState
из веб-браузера до установлен Завершиться.
Но на самом деле событие иногда запускается с ReadyState
набор для Завершения несколько раз.
Я не думаю, что существует решение с той дрянной.NET WebBrowser, но мог бы быть тот, если я использую базовый компонент DOM.
Только проблема, я понятия не имею, как действительно получают доступ к компоненту DOM позади WebBrowser, который запускает событие DocumentCompleted.
DocumentCompleted срабатывает для каждого кадра на веб-странице. Сложный способ - подсчитать количество кадров, показывает, как получить доступ к DOM:
private int mFrameCount;
private void startNavigate(string url) {
mFrameCount = 0;
webBrowser1.Navigate(url);
}
private void DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
mFrameCount += 1;
bool done = true;
if (webBrowser1.Document != null) {
HtmlWindow win = webBrowser1.Document.Window;
if (win.Frames.Count > mFrameCount && win.Frames.Count > 0) done = false;
}
if (done) {
Console.WriteLine("Now it is really done");
}
}
Простой способ - проверить URL-адрес, который завершил загрузку:
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (e.Url.Equals(webBrowser1.Url)) {
Console.WriteLine("Now it is really done");
}
}
Это, вероятно, произойдет, если страница использует Javascript или для перенаправления на другую страницу.
Если это так, то хорошего обходного пути нет.