2012-01-10 16 views
7

estoy tratando de interceptar tocando en un enlace en un control WebBrowser. Mi página HTML contiene enlaces personalizados, para algunos comenzando con shared: // Me gustaría interceptar cuando el usuario toque en él.Procedimiento para interceptar cuando el usuario haga clic en un enlace en un navegador web

En el iPhone me gustaría utilizar la web View: shouldStartLoadWithRequest: navigationType: método, y mirar a la dirección URL que se ha seleccionado.

no he logrado reproducir un comportamiento similar con Silverlight para Windows Phone.

que hago algo así como:

{ 
     webBrowser1.Navigating += new EventHandler<NavigatingEventArgs>(webBrowser1_Navigating); 
    } 

    void webBrowser1_Navigating(object sender, NavigatingEventArgs e) 
    { 
     string scheme = null; 

     try 
     { 
      scheme = e.Uri.Scheme; // <- this is throwing an exception here 
     } 
     catch 
     { 
     } 
     if (scheme == null || scheme == "file") 
      return; 
     // Not going to follow any other link 
     e.Cancel = true; 
     if (scheme == "shared") 
     { 

     } 

Pero supongo que una excepción al leer algunas de las propiedades de la URI, cuando es un URI de serie con un archivo predeterminado: // URL Además, el evento ISN Navegando' t incluso se activó para los enlaces que comienzan con shared: //

Ahora que puedo capturar el tapping en un shared: // No me importa mucho, pero al menos me gustaría poder recuperar la URL vamos a navegar y cancelar la operación predeterminada para una URL en particular.

Alguna idea de lo que está pasando? Gracias

Editar: Resultó que el problema es que el evento Navegando se genera solamente para los siguientes enlaces: file: // http: // o mailto: // Los atributos del esquema de la URI se solo disponible para http: // y mailto: // enlaces

así que lo que hice al final fue reemplazar el enlace shared: // con http://shared/blah ... Y miro la URL ... Esto funciona para mi proposito. Ahora puedo tener enlaces que tienen una acción diferente (como abrir una ventana adicional) dependiendo de los enlaces en el html.

+0

En realidad la excepción se lanzado para todo menos un enlace externo (URL que comience por http: //) o correo electrónico (url comenzando con mailto: //) – jyavenard

+1

¿Ha intentado utilizar e.Uri.ToString() y luego analizarlo para recuperar el esquema? –

+0

¿Cómo se detecta cuando se hace clic en 'shared: //'? – keyboardP

Respuesta

5

Aquí está mi código final, en caso de que esto es útil para alguien en el futuro:

Para una sobre la pantalla, utilizo un archivo html que aparece en un componente WebBrowser. La página de acerca tiene un enlace de "cuéntale a tu amigo acerca de esta aplicación", así como enlaces a un sitio web externo. También tiene subpáginas locales.

sub-páginas locales están vinculados a la utilización de un archivo: // enlace. Esos pueden navegarse dentro del componente WebBrowser. Los enlaces externos se abren externamente con Internet Explorer. El enlace Dile a tu amigo está formado por un enlace http://shared, que abre un correo electrónico con un asunto y un cuerpo preestablecidos. Por desgracia, no hay otro esquema que las estándar están disponibles, ya que no activan un evento de Navegación

También hay un enlace de soporte que es un mailto: // enlace y abre una EmailComposeTask

void webBrowser1_Navigating(object sender, NavigatingEventArgs e) 
    { 
     String scheme = null; 

     try 
     { 
      scheme = e.Uri.Scheme; 
     } 
     catch 
     { 
     } 
     if (scheme == null || scheme == "file") 
      return; 
     // Not going to follow any other link 
     e.Cancel = true; 
     if (scheme == "http") 
     { 
      // Check if it's the "shared" URL 
      if (e.Uri.Host == "shared") 
      { 
       // Start email 
       EmailComposeTask emailComposeTask = new EmailComposeTask(); 
       emailComposeTask.Subject = "Sharing an app with you"; 
       emailComposeTask.Body = "You may like this app..."; 
       emailComposeTask.Show(); 
      } 
      else 
      { 
       // start it in Internet Explorer 
       WebBrowserTask webBrowserTask = new WebBrowserTask(); 
       webBrowserTask.Uri = new Uri(e.Uri.AbsoluteUri); 
       webBrowserTask.Show(); 
      } 
     } 
     if (scheme == "mailto") 
     { 
      EmailComposeTask emailComposeTask = new EmailComposeTask(); 
      emailComposeTask.To = e.Uri.AbsoluteUri; 
      emailComposeTask.Show(); 
     } 
    } 
+0

También podría usar el esquema "sobre:". Convenientemente te da todo después de los dos puntos en AbsoluteUri. – Nedko

Cuestiones relacionadas