【问题标题】:Xamarin Forms WebView cache: GoBack() doesn't call Navigating eventXamarin Forms WebView 缓存:GoBack() 不调用导航事件
【发布时间】:2018-07-22 22:31:25
【问题描述】:

正如我之前在 this question 中所说,我是 Xamarin.Forms 的新手,我正在使用 Microsoft Visual Studio 2017 版本 15.5.4 开发跨平台 Web 浏览器。我正在 Android 5.1 智能手机上调试。

在我的布局中,有一个 WebView 和两个 Buttons 可以后退/前进。

<Button Image="backarrowdisabled.png"
        Grid.Row="1"
        Grid.Column="0"
        x:Name="backButton"
        IsEnabled="False"
        Clicked="previousPage">
    <Button.Triggers>
        <DataTrigger TargetType="Button"
                     Binding="{Binding CanGoBack, Source={Reference appWebView}}"
                     Value="False">
            <Setter Property="IsEnabled" Value="False" />
            <Setter Property="Image" Value="backarrowdisabled.png" />
        </DataTrigger>

        <DataTrigger TargetType="Button"
                     Binding="{Binding CanGoBack, Source={Reference appWebView}}"
                     Value="True">
            <Setter Property="IsEnabled" Value="True" />
            <Setter Property="Image" Value="backarrow.png" />
        </DataTrigger>
    </Button.Triggers>
</Button>


<Button Image="nextarrowdisabled.png"
        Grid.Row="1"
        Grid.Column="5"
        x:Name="nextButton"
        IsEnabled="False"
        Clicked="nextPage">
        /* triggers */   
</Button>

<WebView Grid.Row="3"
         Grid.Column="0"
         Grid.ColumnSpan="6"
         x:Name="appWebView"
         Source="https://www.google.it/"
         Navigating="onPageLoading"
         Navigated="onPageLoaded"/>

如您所见,有两种方法可以管理NavigatingNavigated 事件,分别是

private void onPageLoading(object sender, WebNavigatingEventArgs e)
{
    URLEntry.Text = e.Url;      //Entry where I can see the page URL
    //other code
}

private void onPageLoaded(object sender, EventArgs e)
{
    //some code       
}

当我点击WebView 中的链接或类似内容时,一切正常,但是当我必须在历史记录中返回/前进时,Entry 不会将 URL 更新为上一个/下一个.似乎它甚至没有调用onPageLoading 方法,而是WebView 加载了页面。

这些是Buttons调用的方法

private void previousPage (object sender, EventArgs e)
{
    appWebView.GoBack();
}

private void nextPage (object sender, EventArgs e)
{
    appWebView.GoForward();
}

这是 WebView 错误还是我做错了什么?

编辑:我认为页面被缓存了,有没有办法让它不这样做?

【问题讨论】:

  • 你检查是否触发了onPageLoaded事件?
  • 无论如何,您的Entry.Text 也可以绑定到WebView.Source。像这样:&lt;Entry x:Name="URLEntry" Text="{Binding Source, Source={x:Reference appWebView}}" ... /&gt;.
  • @DiegoRafaelSouza 我已经检查过了,它触发了onPageLoaded,但不是onPageLoading
  • Hmn... 似乎有一个缓存在后台工作,我在官方文档中没有找到任何关于它的信息,但是一旦组件提供了GoBackGoForward 就可以理解了方法。为了保持您的思路,只需将onPageLoaded 方法的签名更改为(object sender, WebNavigatedEventArgs e) 并尝试在其中设置URLEntry.Text = e.Url; 而不是onPageLoading 作为解决方法。 (对不起我的英语不好)
  • @DiegoRafaelSouza 好的,非常感谢。现在我注意到当我在我的 .cs 文件中手动定义 appWebView.Source 时遇到了同样的问题,那就是它触发了 onPageLoaded 而不是 onPageLoading... 当我单击 WebView 中的链接时,我没有这些问题

标签: c# android visual-studio xamarin xamarin.forms


【解决方案1】:

您可以做的一件事是为WebViewPropertyChangedPropertyChanging 事件创建另一个事件处理程序。在那里,您可以检查Source 属性是否已更改;如果是这样,您可以使用新源更新TextView。 (我不确定,但似乎在向后或向前导航时,Navigating 事件没有被调用,可能是因为页面已被缓存?)

请看这里:https://developer.xamarin.com/api/member/Xamarin.Forms.WebView.OnPropertyChanged/p/System.String/

所以你的代码看起来像

<WebView x:Name="MyWebView" PropertyChanged="OnWebViewPropertyChanged" />

然后是你的代码:

private void OnWebViewPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == WebView.SourceProperty.PropertyName)
    {
        URLEntry.Text = MyWebView.Source.ToString(); // May need to check this
    }
}

【讨论】:

  • 未处理的异常:Xamarin.Forms.Xaml.XamlParseException:位置 100:22。方法 OnWebViewPropertyChanged 没有正确的签名
  • 如果我将方法声明为protected override void,则相同(因为它写在您链接的页面上)
  • @mara6399 我更新了答案以显示正确的方法签名。我猜 Xamarin 的文档有点不对劲。
  • 现在完美运行,只需使用(appWebView.Source as UrlWebViewSource).Url 编辑而不是MyWebView.Source.ToString()
猜你喜欢
  • 2018-02-19
  • 2020-02-07
  • 2020-12-21
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多