none
Como trabalhar com WebBrowser de forma síncrona? RRS feed

  • Pergunta

  • Amigos,

    Preciso carregar uma página no webbrowser [de forma dinâmica, ou seja, nada visual... usando WebBrowser Browser = new WebBrowser()] e em seguida consumir o Browser.Document.

    Tentei fazer o código aguardar... mas não consegui! Alguém sabe fazer isso??? (Segue a minha tentativa... QUE NÃO FUNCIONA)

    public gContinuarFluxo == false; private void btnVerificar_Click(object sender, RoutedEventArgs e) { Uri lBuscaGoogle = new Uri("https://www.google.com.br/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=" + WebPreparaStringDeBuscaParaOGoogle("isto foi um teste")); wbbBrowser.Source = lBuscaGoogle;

    do { teste++; } while (gContinuarFluxo == false); //Para o código enquanto a página não é carregada (NÃO FUNCIONA) }

    e

    private void wbbBrowser_LoadCompleted(object sender, NavigationEventArgs e)
    {
          gContinuarFluxo = true;
    }

    Obrigado!

    terça-feira, 25 de novembro de 2014 14:13

Todas as Respostas

  • Olá,

    Uma página web pode ser composta, e na maioria das vezes é, por vários HtmlDocuments dentro dela. Então, cada vez que um desses Documentos é carregado completamente o evento LoadCompleted (DocumentCompleted no Win Forms) é chamado.

    No fim das contas, o que você tem são múltiplas chamadas para esse evento, o que não é conveniente, pois as vezes, com 40% da página carregada você já obtem chamadas para o evento.

    Mas, há uma forma bem simples de resolver isso:

            private void wb_LoadCompleted(object sender, NavigationEventArgs e)
            {
                if(e.Uri == ((WebBrowser)sender).Source)
                {
                    // Aqui você executa o código após a página ser totalmente carregada
                }
            }

    Devo ressaltar que nunca testei isso. Esse código é uma conversão do que é factível e funcional no Win Forms, conforme artigo:

    WebBrowser: Previnindo múltiplas chamadas do evento DocumentCompleted | Herbert.Lausmann

    Espero ter ajudado.


    Herbert Lausmann

    terça-feira, 25 de novembro de 2014 17:51
  • Amigos, resolvi!

    Apenas adicionar "Thread.Sleep(10);" e "System.Windows.Forms.Application.DoEvents();" dentro do "do", veja:

    public gContinuarFluxo == false;
    
    private void btnVerificar_Click(object sender, RoutedEventArgs e)
    {
    	Uri lBuscaGoogle = new Uri("https://www.google.com.br/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=" + WebPreparaStringDeBuscaParaOGoogle("isto foi um teste"));
    
    	wbbBrowser.Source = lBuscaGoogle;
    	do {
                     Thread.Sleep(10);
                     System.Windows.Forms.Application.DoEvents();
                } while (gContinuarFluxo == false); //Para o código enquanto a página não é carregada (NÃO FUNCIONA)
    }

    Entenderam?

    terça-feira, 25 de novembro de 2014 17:54