Как я могу обнаружить когда Система. Windows. Формы. Управление WebBrowser завершило загрузку?
Я пытался использовать события Navigate и DocumentCompleted, но они оба были повышены несколько раз во время загрузки документа!
Я думаю, что событие DocumentCompleted
будет запущено для всех загружаемых дочерних документов (например, JS и CSS). Вы можете посмотреть на WebBrowserDocumentCompletedEventArgs
в DocumentCompleted
, проверить свойство Url и сравнить его с URL-адресом главной страницы.
Я сделал следующее:
void BrowserDocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
return;
//The page is finished loading
}
Последняя загруженная страница, как правило, является той, на которую перешли, так что это должно сработать.
From here.
Если вы используете WPF, возникает событие LoadCompleted
.
Если это Windows.Forms
, событие DocumentCompleted
должно быть правильным. Если на загружаемой странице есть фреймы, ваш элемент управления WebBrowser
будет запускать событие DocumentCompleted
для каждого кадра (подробнее см. здесь ). Я бы посоветовал проверять свойство IsBusy
каждый раз, когда событие запускается, и если оно ложно, то ваша страница полностью загружена.
Похоже, что он не запускает события DocumentCompleted/Navigated для внешних файлов Javascript или CSS, но запускает для iframe. Как говорит PK, сравните свойство WebBrowserDocumentCompletedEventArgs.Url (у меня пока нет кармы, чтобы сделать комментарий).
Обратите внимание, что URL-адрес в DocumentCompleted может отличаться от URL-адреса перехода из-за переноса сервера или нормализации URL-адреса (например, вы переходите на www.microsoft.com и получаете http://www.microsoft.com в documentcomplete )
На страницах без фреймов это событие запускается один раз после завершения загрузки. На страницах с несколькими фреймами это событие запускается для каждого навигационного фрейма (навигация по заметкам поддерживается внутри фрейма, например, щелчок по ссылке во фрейме может перемещать фрейм на другую страницу). Фрейм навигации самого высокого уровня, который может быть или не быть браузером верхнего уровня, запускает последнее событие DocumentComplete.
В собственном коде вы должны сравнить отправителя события DocumentComplete, чтобы определить, является ли событие последним событием в навигации или нет . Однако в Windows Forms параметр отправителя не заключен в оболочку WebBrowserDocumentCompletedEventArgs. Вы можете либо обработать собственное событие , чтобы получить значение параметра, либо проверить свойство readystate браузера или фрейм документов в обработчике событий DocumentCompleted, чтобы узнать, не все кадры в состоянии готовности.
Существует проблема с методом readystate, так как если присутствует менеджер загрузки , а навигация ведет к загружаемому файлу, навигация может быть отменена диспетчером загрузки, и состояние готовности не будет завершено. .