Detect WebBrowser chargement complet de la page

Comment détecter un système.Windows.Forme.Le contrôle WebBrowser a terminé le chargement?

j'ai essayé d'utiliser les événements naviguer et DocumentCompleted, mais les deux ont été soulevées à quelques reprises lors du chargement de documents!

52
demandé sur Lu55 2010-05-06 05:33:02

9 réponses

je pense que l'événement DocumentCompleted sera viré pour tous les documents enfants qui sont chargés aussi (comme JS et CSS, par exemple). Vous pouvez regarder le WebBrowserDocumentCompletedEventArgs dans DocumentCompleted et vérifier la propriété Url et comparer cela à L'Url de la page principale.

32
répondu Paul Kearney - pk 2012-06-23 20:20:27

j'ai fait ce qui suit:

void BrowserDocumentCompleted(object sender,
        WebBrowserDocumentCompletedEventArgs e)
{
  if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
    return; 

  //The page is finished loading 
}

la dernière page chargée a tendance à être celle vers laquelle on navigue, donc ça devrait marcher.

à Partir de ici .

27
répondu Kyle Rozendo 2017-05-23 12:26:19

ce qui suit devrait fonctionner.

private 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
}
16
répondu ePandit 2012-03-23 07:59:14

notez que L'url dans DocumentCompleted peut être différente de l'url de navigation en raison du transfert du serveur ou de la normalisation de l'url (par exemple, vous naviguez vers www.microsoft.com et j'ai eu http://www.microsoft.com in documentcomplete)

dans les pages sans cadre, cet événement se déclenche une fois que le chargement est terminé. Dans les pages avec plusieurs cadres, cet événement se déclenche pour chaque cadre de navigation (note la navigation est supportée à l'intérieur d'un cadre, par exemple en cliquant sur un lien dans un cadre pourrait naviguer dans le cadre à une autre page). Le cadre de navigation de niveau le plus élevé, qui peut être ou non le navigateur de niveau le plus élevé, déclenche l'événement final D'achèvement de document.

en code natif vous comparez l'expéditeur de L'événement DocumentComplete pour déterminer si l'événement est l'événement final dans la navigation ou non . Cependant, dans Windows Forms, le paramètre sender n'est pas Enveloppé par WebBrowserDocumentCompletedEventargs. Vous pouvez soit évier de la maternelle de l'événement pour obtenir la valeur du paramètre, ou cocher la case propriété readystate du navigateur ou cadre " documents dans le DocumentCompleted gestionnaire d'événements pour voir si toutes les images sont dans l'état prêt.

Il ya un prolblem avec la méthode readystate comme si un download manager est présent et la navigation est vers un fichier téléchargeable, la navigation pourrait être annulée par le gestionnaire de téléchargement et le readystate ne deviendra pas complète.

13
répondu Sheng Jiang 蒋晟 2013-01-29 22:35:23

j'ai eu le même numéro de plusieurs DocumentCompleted événements tirés et essayé toutes les suggestions ci-dessus. Enfin, il semble que dans mon cas, ni la propriété IsBusy ne fonctionne correctement ni la propriété Url , mais la propriété ReadyState semble être ce dont j'avais besoin, parce qu'elle a le statut "Interactive" lors du chargement des cadres multiples et elle obtient le statut "complète" seulement après avoir chargé le dernier. Ainsi, je sais quand la page est entièrement chargée avec tous ses composants.

j'espère que cela peut aider les autres aussi :)

4
répondu iArv 2011-11-14 15:46:03

il ne semble pas déclencher D'événements Documentcomplet/Navigated pour les fichiers Javascript ou CSS externes, mais il le fera pour les iframes. Comme le dit PK, comparez le document de Webbrowserpletedeventargs.Propriété Url (Je n'ai pas encore le karma de faire un commentaire).

3
répondu Joel Rein 2010-05-06 02:30:22

si vous utilisez WPF, il y a un événement LoadCompleted .

si c'est Windows.Forms , l'événement DocumentCompleted devrait être le bon. Si la page que vous chargez a des cadres, votre commande WebBrowser déclenchera l'événement DocumentCompleted pour chaque cadre (voir ici pour plus de détails). Je suggère de vérifier la propriété IsBusy chaque fois que l'événement est déclenché et si elle est fausse, alors votre page est entièrement chargée.

2
répondu alimbada 2010-05-06 02:56:00

L'utilisation de L'événement DocumentCompleted avec une page avec plusieurs cadres imbriqués n'a pas fonctionné pour moi.

j'ai utilisé L'Interop.Bibliothèque SHDocVW pour lancer le contrôle WebBrowser comme ceci:

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;
    }

ce code fonctionne pour moi quand je navigue vers une URL définie en utilisant le webBrowserControl.Naviguer (url) méthode, mais je ne sais pas comment contrôler la page complète quand un bouton html est cliqué en utilisant le htmlElement.InvokeMember ("clic").

0
répondu Frank_FC 2013-08-29 21:17:56

vous pouvez utiliser l'événement ProgressChanged ; la dernière fois qu'il est soulevé indiquera que le document est entièrement rendu:

this.webBrowser.ProgressChanged += new
WebBrowserProgressChangedEventHandler(webBrowser_ProgressChanged);
0
répondu Vincent Lidou 2013-12-18 00:31:20