Xamarin Forms WebView.CanGoBack总是返回false在UWP

问题描述:

使用Xamarin Forms WebView控件,我重写了OnBackButtonPressed()并发现CanGoBack在UWP中总是返回false。Xamarin Forms WebView.CanGoBack总是返回false在UWP

我在Android中看不到这个问题。

这是一个XF错误还是我做错了什么?

注:我运行XF v2.3.3.193

编辑:我升级到XF 2.3.4.247和问题仍然存在。

我创建了一个代码示例,并在WebView浏览多个网站时重现您的问题。我在Xamarin.Forms源代码中发现了原因。当调用UpdateCanGoBackForward方法

void UpdateCanGoBackForward() 
{ 
((IWebViewController)Element).CanGoBack = Control.CanGoBack; 
((IWebViewController)Element).CanGoForward = Control.CanGoForward; 
} 

CanGoBack属性将被改变。只有在调用本地NavigationCompleted事件时才会调用UpdateCanGoBackForward方法。因此,如果某个网站无法快速加载,则CanGoBack属性不会更改。

您可以通过自定义WebView改进此设计。你可以按照下面的代码。

CustomWebView.cs

添加新的属性CustomWebView

public class CustomWebView : WebView 
{ 
    public bool CCanGoBack { get; set; } 

    public CustomWebView() 
    { 

    } 
} 

CustomWebViewRenderer.cs

并更改属性时ContentLoading事件被调用。

[assembly: ExportRenderer(typeof(CustomWebView), typeof(CustomWebViewRenderer))] 

namespace CustomWebViewTest.UWP 
{ 
    public class CustomWebViewRenderer : WebViewRenderer 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<WebView> e) 
     { 
      base.OnElementChanged(e); 

      if (Control != null) 
      { 
       Control.ContentLoading += Control_ContentLoading; 
      } 
     } 

     private void Control_ContentLoading(Windows.UI.Xaml.Controls.WebView sender, Windows.UI.Xaml.Controls.WebViewContentLoadingEventArgs args) 
     { 
      (Element as CustomWebView).CCanGoBack = Control.CanGoBack; 
     } 
    } 
} 

MainPage.cs

private void backClicked(object sender, EventArgs e) 
{ 
    if (Browser.CCanGoBack) 
    { 
     Browser.GoBack(); 
    }  
} 
+0

只是一个评论说,这虽然解决UWP,它打破了Android的(因为我没有对机器人定制呈现)。我不确定在Android渲染器中做什么,而不是创建一个,我只是做一个RuntimePlatform检查,并根据平台检查CCanGoBack或CanGoBack。 – erin