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

Xamarin.forms 如何在ViewModel中拦截WebView导航事件,xamarin.forms,freshmvvm,Xamarin.forms,Freshmvvm,我的应用程序有一个网络视图,用于显示一些联系信息。它有一个指向我想使用Device.OpenUri()从外部加载的网站的链接。我正在使用,我想在ViewModel中截取WebView中的导航事件,并取消将外部页面加载到WebView中的默认操作 我尝试过使用调用我的ViewModel命令的插件: <WebView HorizontalOptions="Fill" VerticalOptions="FillAndExpand"

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

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


这是最好的方法还是我应该寻找替代方法?

您不能使用WebView导航,必须使用自定义渲染(hybridwebview)。 下面是一个解释:


最近,为了我偶然发现的另一个项目,我重新审视了这一点。更新的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
            ));
    }
}
public命令导航命令
{
得到
{
返回导航命令??(导航命令=新命令(
(参数)=>
{
if(param!=null&&1真
));
}
}

无需指定CommandParameter,NavigatingCommand应为DelegateCommand类型,tappedItem是参数的item属性。@rauland在使用该方法时,即省略CommandParameter,我没有得到任何作为参数传递的信息-即使在指定
object
作为参数类型时也是如此。也许你误解了我想要实现的目标。我想截获点击WebView中的链接时触发的
导航
事件,然后在外部浏览器中打开关联的URL。我没有尝试使用链接在应用程序中导航。