2011-10-08 16 views
11

¿Cómo puedo obtener el título de la página en un control WebBrowser cuando navego a diferentes sitios web?¿Cómo puedo obtener el título de la página en el control WebBrowser?


xmlns

xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" 

propiedades que comienzan con D

DataContext 
DesiredSize 
Dispatcher 
DoubleTap 

etiqueta xaml

<phone:WebBrowser Name="browser" Height="760" VerticalAlignment="Top"></phone:WebBrowser> 

Respuesta

9

Tuve el mismo problema. La respuesta de @Akash Kava es casi correcta, pero esta es la correcta JavaScript para leer el título html:

String title = (string)browser.InvokeScript("eval", "document.title.toString()"); 
+0

Como dijo David, para funcionar correctamente, se debe invocar en el controlador de eventos ** WebBrowser.LoadCompleted **. Además, como esto se está ejecutando en un controlador de eventos, el código anterior debe invocarse dentro de la acción de 'Control.Invoke' para WPF o' Dispatcher.Invoke' para Silverlight/Windows Phone si la UI se está actualizando. – Ben

0

Puede utilizar InvokeScript para obtener título como,

String title = browser.InvokeScript("document.title"); 

No lo sé, es correcto o no, pero prueba "window.title".

+0

Probé en el evento 'LoadCompleted' y arrojó una excepción desconocida. – BrunoLM

+0

Debe habilitar las secuencias de comandos según la documentación de msdn y también este método solo se puede invocar una vez que se haya cargado el documento, por lo que debe esperar algún tiempo si el documento no está listo. –

+1

Intenté llamar esto cuando recibo el evento Navegado y obtengo una excepción que dice "Error: 80020006". Y sí, tengo IsScriptEnabled = "True" en mi XAML. – tronman

0

estoy bastante seguro de que

String title = browser.Document.Title; 

debe hacer el truco.

Ver here.

+0

Propiedades que comienzan con D: DataContext, DesiredSize, Dispatcher, DoubleTap. (Microsoft.Phone.Controls). xaml tag: '' – BrunoLM

+1

Lo siento, estaba pensando en el control Forms WebBrowser normal. ¿Has probado la respuesta de @Akash Kava pero con la propiedad 'IsScriptEnabled' establecida en' true'? –

+0

sí, el mismo resultado ... – BrunoLM

2

Para mí funciona el siguiente código. Las respuestas de @Akash y @Mikko me pusieron en el camino correcto, pero todavía tenía algunos problemas con algunos sitios web. El problema es que el evento Navegado se produce cuando el componente WebBrowser comienza a recibir datos del servidor remoto. Como tal, el objeto DOM aún no está completo, por lo que llamar al document.title arroja un error. Así que lo vuelvo a intentar después de unos pocos milisegundos hasta que obtenga el título. Este "bucle" nunca se ha repetido más de 3 veces en cualquier sitio web que probé y sin problemas me trajo el título cada vez.

private void webBrowser1_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e) 
{ 
    ThreadPool.QueueUserWorkItem(UpdateText); 
} 

private void UpdateText(object o) 
{ 
    Thread.Sleep(100); 
    Dispatcher.BeginInvoke(() => 
    { 
     try 
     { 
      textBlock1.Text = webBrowser1.InvokeScript("eval", "document.title").ToString(); 
     } 
     catch (SystemException) 
     { 
      ThreadPool.QueueUserWorkItem(UpdateText); 
     } 
    }); 
} 
0

El siguiente código funciona para mí, observar el evento navegado, si utiliza cargado se activará justo antes de que se cargue la página, usted quiere que para desencadenar algún momento "después" de la página es actúa a plena carga, navegadas como ese evento.

private void web1_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e) 
    { 
     //Added thread using "using System.Thread", to act as a buffer for any page delay. 
     Thread.Sleep(2000); 
     String title = (string)web1.InvokeScript("eval", "document.title"); 
     PageTitle.Text = title; 

    } 
1

Todas las respuestas no son 100% correcto:

debe llamar al siguiente:

String title = (cadena) browser.InvokeScript ("eval", "document.title.toString () ");

en el LoadCompleted caso de que el navegador, y no en el navegado evento.

Cuestiones relacionadas