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。我没有尝试使用链接在应用程序中导航。