2012-10-03 8 views
11

Ho un componente WebView che utilizzo per visualizzare annunci HTML nella mia app. Quando l'utente fa clic su un annuncio nella visualizzazione Web, desidero aprire il collegamento dell'annuncio in un browser esterno. Come lo faccio?Apre i collegamenti nel browser esterno in WebView (WinRT)

Ho bisogno di qualcosa come OnNavigating dal browser WP7. Ho provato l'evento Tapped di WebView ma non viene mai chiamato anche quando imposto IsTapEnabled = true. Mi serve qualcosa come

risposta

20

Per questo motivo è necessario utilizzare l'evento ScriptNotify. Ecco come ho gestito lo scenario (usando NavigateToString). Se stai recuperando il contenuto della visualizzazione web da un URL, dovrai essere in grado di modificare l'HTML affinché funzioni.

  1. Aggiungere il seguente codice JavaScript al codice HTML

    <script type="text/javascript">for (var i = 0; i < document.links.length; i++) { document.links[i].onclick = function() { window.external.notify('LaunchLink:' + this.href); return false; } }</script> 
    

    Questo aggiunge un gestore onclick per ogni link (< a href = "..." > </a >) nella pagina. window.external.notify è un metodo Javascript che funziona nella Webview.

  2. Aggiungere il gestore eventi ScriptNotify alla visualizzazione Web.

    WebView.ScriptNotify += WebView_ScriptNotify; 
    
  3. Dichiarare il gestore di eventi

    async private void WebView_ScriptNotify(object sender, NotifyEventArgs e) 
    { 
        try 
        { 
         string data = e.Value; 
         if (data.ToLower().StartsWith("launchlink:")) 
         { 
          await Launcher.LaunchUriAsync(new Uri(data.Substring("launchlink:".Length), UriKind.Absolute)); 
         } 
        } 
        catch (Exception) 
        { 
         // Could not build a proper Uri. Abandon. 
        } 
    } 
    

Si noti che se si sta utilizzando un URL esterno, questo deve essere aggiunto al permesso whitelist Uris del WebView (http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webview.scriptnotify per riferimento) .

+0

ma che dire del collegamento ipertestuale ai file? questo non funziona http://stackoverflow.com/questions/28886198/hyperlink-click-is-not-firing/ –

+0

In questo scenario, prova a cambiare UriKind.Absolute in UriKind.Relative – Akinwale

10

Prova a gestire l'evento NavigationStarting. Qui puoi intercettare e annullare il caricamento dell'URL. È possibile filtrare quale collegamento aprire nella vista Web e quale aprire nel browser predefinito.

private async void webView_NavigationStarting(WebView sender, WebViewNavigationStartingEventArgs args) 
    { 
     if(null != args.Uri && args.Uri.OriginalString == "URL OF INTEREST") 
     { 
      args.Cancel = true; 
      await Launcher.LaunchUriAsync(args.Uri); 
     } 
    } 
+0

Grazie! Questo ha funzionato per me. –