Как перехватить событие 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). Вот объяснение:

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

Другие вопросы по тегам