Как перехватить событие WebView Navigating во ViewModel
У моего приложения есть WebView для отображения некоторой контактной информации. Он имеет ссылку на сайт, который я хочу загрузить с помощью внешнего Device.OpenUri()
, Я использую FreshMvvm и хочу перехватить Navigating
событие из WebView в ViewModel и отмена действия по умолчанию, которое будет загружать внешнюю страницу в WebView.
Я попытался использовать плагин 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 ссылки, по которой был произведен переход, и я не знаю, как тогда предотвратить поведение по умолчанию.
Это лучший подход или я должен искать альтернативу?
2 ответа
Пересмотрев это недавно для другого проекта, я наткнулся на ответ. Обновленный 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
));
}
}
Вы не можете перемещаться с WebView, вы должны использовать пользовательский рендер (hybridwebview). Вот объяснение: