2016-04-11 13 views
1

私のアプリには連絡先情報を表示するためのWebViewがあります。 Device.OpenUri()を使用して外部からロードするウェブサイトへのリンクがあります。 FreshMvvmを使用していて、ViewModelのWebViewからNavigatingイベントをインターセプトして、外部ページをWebViewにロードするデフォルトのアクションをキャンセルします。WebViewをインターセプトする方法ViewModelでイベントをナビゲートする

私は私のViewModelコマンドを呼び出していCorcav.Behaviorsプラグイン使用して試してみた:

 <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は引数のitemプロパティです。 – 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> 

デバイスのブラウザでリンクを開く前に、有効なオプションのリストに対してタップURLと一致ViewModelに、内のコードは、次のとおりです。

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のリンクをタップしたときにトリガーされた 'Navigating'イベントをインターセプトしてから、関連するURLを外部ブラウザーで開きたいと考えています。私はリンクを使ってアプリ内をナビゲートしようとしていません。 –

関連する問題