Xamarin Forms WebView Navigated 事件未在 iOS 上一致触发

发布时间:2021-02-26 15:07

我有一个 Xamarin Forms ContentPage,它有一个 WebView 和一个 ActivityIndi​​cator。我已将事件处理程序连接到 WebView Navigating 和 Navigated 事件以激活和取消激活 ActivityIndi​​cator。这一切都适用于 Android。在 iOS 上,Navigating 事件会在页面加载时触发多次,但 Navigated 事件不会随之触发。这通常会使 ActivityIndi​​cator 处于永久激活状态。有没有人找到不涉及自定义 WebView 渲染的修复或解决方法,或者自定义渲染器是唯一可行的方法?如果需要自定义渲染器,是否有人有适用于此目的的示例?

更新:根据要求在此处添加代码。

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:vm="clr-namespace:FFXPubXam.ViewModels" 
             x:Class="FFXPubXam.Views.WebPage"
             x:Name="root"
             Shell.NavBarIsVisible="false">
    <ContentPage.Content>
        <Grid>
            <WebView x:Name="WebViewControl" 
             Source="{Binding Url}" 
             Navigating="WebViewControl_Navigating" 
             Navigated="WebViewControl_Navigated" />
            <ActivityIndicator x:Name="activity"
                               IsRunning="False"  
                               IsEnabled="False"  
                               IsVisible="False"  
                               HeightRequest="40"
                               WidthRequest="100"
                               VerticalOptions="CenterAndExpand"
                               HorizontalOptions="CenterAndExpand"
                               Color="{DynamicResource FFX_Blue4}"
                               BackgroundColor="Transparent"/>
        </Grid>
    </ContentPage.Content>
</ContentPage>

using FFXPubXam.Helpers;
using FFXPubXam.ViewModels;
using System;
using Xamarin.Forms;

namespace FFXPubXam.Views
{
    public partial class WebPage : ContentPage
    {
        public WebPage(string arg)
        {
            InitializeComponent();
            BindingContext = new WebPageViewModel(arg);
        }

        protected override void OnAppearing()
        {
            ToggleActivityIndicator(true);

            base.OnAppearing();
        }

        private void WebViewControl_Navigating(object sender, WebNavigatingEventArgs e)
        {
            ToggleActivityIndicator(true);
        }

        private void WebViewControl_Navigated(object sender, WebNavigatedEventArgs e)
        {
            ToggleActivityIndicator(false);
        }

        private void ToggleActivityIndicator(bool state)
        {
            activity.IsRunning = state;
            activity.IsEnabled = state;
            activity.IsVisible = state;
        }
    }
}
回答1

我无法在 Android 上启动 NavigatedNavigating,尚未在 iOS 上进行测试,但这可能是因为我正在加载本地 HTML 文件,所以我的情况是有点不同......无论哪种方式,这种解决方法都可能有助于解决这个一般问题,因为它仍然多次触发 Navigating 但在我没有得到之前。

我需要在代码隐藏中设置 WebView.SourceWebView.NavigatingWebView.Navigated,而不是像这样在 Xaml 中设置:

public WebPage(string arg) {
    InitializeComponent();
    BindingContext = new WebPageViewModel(arg);
    WebViewControl.Source = (BindingContext as WebPageViewModel).Url;

    WebViewControl.Navigating += WebViewControl_Navigating;
    WebViewControl.Navigated += ContentEditorWebView_Navigated;
}

我不确定发生这种情况的原因,但我认为这是由于 WebView 是非原生的,并且仅在创建特定于设备的控件时才会发生呈现。