我有一个 Xamarin Forms ContentPage,它有一个 WebView 和一个 ActivityIndicator。我已将事件处理程序连接到 WebView Navigating 和 Navigated 事件以激活和取消激活 ActivityIndicator。这一切都适用于 Android。在 iOS 上,Navigating 事件会在页面加载时触发多次,但 Navigated 事件不会随之触发。这通常会使 ActivityIndicator 处于永久激活状态。有没有人找到不涉及自定义 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;
}
}
}
我无法在 Android 上启动 Navigated
或 Navigating
,尚未在 iOS 上进行测试,但这可能是因为我正在加载本地 HTML 文件,所以我的情况是有点不同......无论哪种方式,这种解决方法都可能有助于解决这个一般问题,因为它仍然多次触发 Navigating
但在我没有得到之前。
我需要在代码隐藏中设置 WebView.Source
、WebView.Navigating
和 WebView.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
是非原生的,并且仅在创建特定于设备的控件时才会发生呈现。