2016-04-11 2 views
1

У моего приложения есть WebView для отображения некоторых контактных данных. Он имеет ссылку на веб-сайт, который я хочу загрузить извне, используя Device.OpenUri(). Я использую FreshMvvm, и я хочу перехватить событие Navigating из WebView в ViewModel и отменить действие по умолчанию, которое загрузит внешнюю страницу в WebView.Как перехватить событие WebView Navigating в ViewModel

Я попытался с помощью Corcav.Behaviors плагина, который делает называть мой ViewModel команды:

 <WebView 
      HorizontalOptions="Fill" 
      VerticalOptions="FillAndExpand" 
      Source="{Binding WebViewSource}"> 
       <b:Interaction.Behaviors> 
       <b:BehaviorCollection> 
        <b:EventToCommand 
         EventName="Navigating" 
         Command="{Binding NavigatingCommand}" 
         CommandParameter="{Binding}"/> <!-- what goes here --> 
       </b:BehaviorCollection> 
       </b:Interaction.Behaviors> 
     </WebView> 

Но я не уверен, что CommandParameter должно быть - мне нужен URI канала связи, который прослушивается, и Я не знаю, как предотвратить предотвращение поведения по умолчанию.

Это лучший подход или я должен смотреть на альтернативу?

+0

Нет необходимости указывать CommandParameter, NavigatingCommand должен иметь тип DelegateCommand , tappedItem - свойство элемента аргумента. – rauland

+0

@rauland, когда я использую этот подход, то есть оставляя CommandParameter, я ничего не передаю в качестве параметра - даже при указании 'object' в качестве типа параметра. –

ответ

1

После этого вновь в последнее время для другого проекта, я наткнулся the answer. Обновленный XAML является:

<WebView 
    x:Name="webView" 
    HorizontalOptions="Fill" 
    VerticalOptions="FillAndExpand" 
    Source="{Binding WebViewSource}"> 
    <behaviors:Interaction.Behaviors> 
     <behaviors:BehaviorCollection> 
      <behaviors:EventToCommand 
       EventName="Navigating" 
       Command="{Binding NavigatingCommand}" 
       PassEventArgument="True" /> 
     </behaviors:BehaviorCollection> 
    </behaviors:Interaction.Behaviors> 
</WebView> 

код в ViewModel, который соответствует повернутой URL против списка допустимых вариантов, прежде чем открыть ссылку в браузере устройства, является:

public Command<WebNavigatingEventArgs> NavigatingCommand 
{ 
    get 
    { 
     return navigatingCommand ?? (navigatingCommand = new Command<WebNavigatingEventArgs>(
      (param) => 
      { 
       if (param != null && -1 < Array.IndexOf(_uris, param.Url)) 
       { 
        Device.OpenUri(new Uri(param.Url)); 
        param.Cancel = true; 
       } 
      }, 
      (param) => true 
      )); 
    } 
} 
0

Вы не можете перемещаться с помощью WebView, вы должны использовать собственный рендер (hybridwebview). Вот объяснение:

https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/custom-renderer/hybridwebview/

+0

Возможно, вы неправильно поняли, чего я пытаюсь достичь. Я хочу перехватить событие «Навигация», которое запускается при нажатии на ссылку в WebView, а затем открывает связанный URL-адрес во внешнем браузере. Я не пытаюсь использовать ссылку для навигации в приложении. –

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