2017-06-15 50 views
0

使用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和問題仍然存在。

回答

2

我創建了一個代碼示例,並在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