如何在ViewModel中拦截WebView导航事件

时间:2016-04-11 22:28:30

标签: xamarin.forms freshmvvm

我的应用程序有一个WebView,用于显示一些联系信息。它有一个指向我想使用Device.OpenUri()外部加载的网站的链接。我正在使用FreshMvvm,我希望从ViewModel中的WebView拦截Navigating事件,并取消将外部页面加载到WebView中的默认操作。

我尝试使用调用我的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,我不知道如何防止发生默认行为。

这是最好的方法,还是我应该考虑另一种选择?

2 个答案:

答案 0 :(得分:2)

最近在另一个项目中重访了这个,我偶然发现了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中的代码,在设备浏览器中打开链接之前将点击的网址与有效选项列表进行匹配,是:

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
            ));
    }
}

答案 1 :(得分:0)

您无法使用WebView进行导航,您必须使用自定义渲染(hybridwebview)。 这是一个解释:

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