2012-03-16 2 views
0

Я пытался использовать элемент управления .NET WebBrowser и столкнулся с общей проблемой - как я могу сказать, когда страница действительно загружена полностью? Я посмотрел здесь, и я посмотрел на Google, и я нашел множество примеров и вопросов, и поэтому я попробовал их. И первое, что я попытался провести, было http://www.microsoft.com. Все прошло не так хорошо.Почему .NET WebBrowser DocumentCompleted слишком много раз срабатывает для microsoft.com?

Мой код ниже. Я попробовал два разных подхода - тот, который использовал сравнение Url, и тот, который подсчитывал кадры. Я не работал так, как я ожидал ... Я получил «Форма1 - Готово - Готово - Готово - Готово» в текстовом значении, что означает, что страница каким-то образом завершилась несколько раз.

Есть ли лучший, более надежный метод для использования со сложными веб-страницами?

Вот мой код:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace WebBrowserCompleted 
{ 
    public partial class Form1 : Form 
    { 
     Uri navTarget = new Uri(@"http://www.microsoft.com"); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 

     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      //webBrowser1.Navigate(navTarget); 
      startNavigate(@"http://www.microsoft.com"); 
     } 

     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"); 
       this.Text = this.Text + " - Done"; 
      } 
     } 
    } 
} 

ответ

0

У меня была аналогичная проблема ... Я бросил этот код в начале DocumentCompleted события, чтобы уменьшить стрельб.

Это значительно сократило проблему, но оно по-прежнему не обязательно идеально подходит для 100% сайтов.

Код:

If Me.wbDebugMain.ReadyState <> WebBrowserReadyState.Complete Then 
    Exit Sub 
End If