2016-05-04 10 views
0

Я разрабатываю простую страницу UWP с помощью web view. Я хотел бы сделать следующее: если щелкнуть внешнюю ссылку, я открою бровер по умолчанию, но если это не внешняя ссылка, я хочу перемещаться по моему web view и добавлять дополнительные заголовки. Для этого я перекрытая в WebViewNavigationStartingEventArgs событий, это мой код:Универсальная платформа для Windows webView override NavigationStarting

private async void WebView_Navigation_Starting(WebView sender, WebViewNavigationStartingEventArgs args) 
    { 
     progressIndicator.Visibility = Visibility.Visible; 
     args.Cancel = true; 

     // external URL 
     if (isExternalUrl(args.Uri.AbsoluteUri)) 
     { 
      //cancel load 
      args.Cancel = true; 
      //launch default browser 
      await Launcher.LaunchUriAsync(args.Uri); 

      progressIndicator.Visibility = Visibility.Collapsed; 
     } 
     else 
     { 
      HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, args.Uri); 
      foreach (KeyValuePair<String,String> header in additionalHeaders) { 
       httpRequestMessage.Headers.Add(header); 
      } 
      webView.NavigateWithHttpRequestMessage(httpRequestMessage); 
     } 

      progressIndicator.Visibility = Visibility.Visible; 
    } 

В версии Android это делается так:

@Override 
public boolean shouldOverrideUrlLoading(final WebView view, final String url) { 
    if (isExternalUrl(url)) { 
     view.getContext().startActivity(
       new Intent(Intent.ACTION_VIEW, Uri.parse(url))); 
     return true; 
    } 

    tvError.setVisibility(View.GONE); 

    setAdditionalHeaders(); 
    view.loadUrl(url, additionalHeaders); 

    return true; 
} 

Но я получаю исключение StackOverflow в этой строке webView.NavigateWithHttpRequestMessage(httpRequestMessage). Кто-нибудь знает, что здесь не так?

EDIT

MainPage.xaml:

<Page 
x:Class="windows_phone.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768" 
FontFamily="{StaticResource PhoneFontFamilyNormal}" 
FontSize="20" 
Foreground="#FF000000"> 

<!--LayoutRoot is the root grid where all page content is placed--> 
<Grid x:Name="LayoutRoot" Background="Transparent"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 

    <!--TitlePanel contains the name of the application and page title--> 

    <!--ContentPanel - place additional content here--> 
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="0,0,0,0"> 
     <WebView 
      x:Name="webView" 
      Margin="0,0,0,0" 
      Grid.Row="1" 
      /> 
    </Grid> 
</Grid> 

MainPage.cs:

public MainPage() 
    { 
     InitializeComponent(); 

     // webView // 
     webView.Settings.IsJavaScriptEnabled = true; 
     webView.ScriptNotify += webView_ScriptNotify; 
     webView.Source = new Uri(GetUrl("/")); 
     webView.NavigationStarting += WebView_Navigation_Starting; 
     webView.NavigationCompleted += WebView_Navigated; 
     webView.Loaded += WebView_Loaded; 
     webView.LoadCompleted += WebView_LoadCompleted; 
     webView.NavigationFailed += Web_View_Navigation_Failed; 
     } 
    } 
+0

Почему вы вызываете этот webView.NavigateWithHttpRequestMessage, когда он уже начал навигацию? Вы должны удалить этот метод. Если его внешняя ссылка вам не нужна. Или вы должны делать args.Cancel = true; прежде чем вы вызовете этот метод – Archana

+0

Хорошо, вы правы, он удаляется, но когда щелчок по внутренней ссылке приложение ничего не делает, я имею в виду, что я не могу перейти в веб-просмотр. – IrApp

+0

Можете ли вы разместить xaml с внутренней ссылкой? Было бы полезно решить – Archana

ответ

1

При вызове метода webView.NavigateWithHttpRequestMessage Navigation_Starting событие будет срабатывать снова , Поэтому сохраните логическую переменную и сделайте ее ложной, прежде чем вы вызовете метод.

 bool done = false; 
      private void WebView_Navigation_Starting(WebView sender, WebViewNavigationStartingEventArgs args) 
      { 
progressIndicator.Visibility = Visibility.Visible; 
     args.Cancel = true; 

     // external URL 
     if (isExternalUrl(args.Uri.AbsoluteUri)) 
     { 
      //cancel load 
      args.Cancel = true; 
      //launch default browser 
      await Launcher.LaunchUriAsync(args.Uri); 

      progressIndicator.Visibility = Visibility.Collapsed; 
     } 
     else 
     { 
       if (!done) 
       { 
        done = true; 
        HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, args.Uri); 
        foreach (KeyValuePair<String, String> header in additionalHeaders) 
        { 
         httpRequestMessage.Headers.Add(header); 
        } 
        webView.NavigateWithHttpRequestMessage(httpRequestMessage); 

       } 
     } 
} 
+0

Он работает как шарм, спасибо большое! – IrApp

Смежные вопросы