2017-06-15 4 views
0

Mit dem Xamarin Forms WebView-Steuerelement überschreibe ich das OnBackButtonPressed() und finde, dass das CanGoBack in UWP immer false zurückgibt.Xamarin Forms WebView.CanGoBack gibt immer falsch auf UWP zurück

Ich sehe dieses Problem nicht in Android.

Ist das ein XF-Fehler oder mache ich etwas falsch?

Hinweis: Ich bin mit XF v2.3.3.193

EDIT: Ich habe ein Upgrade 2.3.4.247 und das Problem weiterhin besteht, um XF.

Antwort

2

Ich habe ein Codebeispiel erstellt und reproduzieren Ihr Problem, wenn das WebView mehrere Website durchsuchen. Und ich habe im Quellcode Xamarin.Forms Grund gefunden.

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

Die CanGoBack Eigenschaft wird geändert werden, wenn UpdateCanGoBackForward Methode aufgerufen. Und UpdateCanGoBackForward Methode wurde nur aufgerufen, wenn das systemeigene Ereignis NavigationCompleted aufgerufen wurde. Wenn also eine Website nicht schnell geladen werden kann, wird die CanGoBack-Eigenschaft nicht geändert.

Sie können dieses Design durch benutzerdefinierte WebView verbessern. Und Sie könnten dem folgenden Code folgen.

CustomWebView.cs

die neue Eigenschaft für CustomWebView hinzufügen.

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

    public CustomWebView() 
    { 

    } 
} 

CustomWebViewRenderer.cs

Und die Eigenschaft ändern, wenn das ContentLoading Ereignis aufgerufen.

[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

Nur ein Kommentar, dass, obwohl diese UWP tat beheben, es Android brach (da ich nicht einen benutzerdefinierten Renderer für droid hatte). Ich war mir nicht sicher, was ich im Android-Renderer tun sollte, anstatt einen zu erstellen, ich mache einfach eine RuntimePlatform-Prüfung und überprüfe entweder CCanGoBack oder CanGoBack abhängig von der Plattform. – erin

Verwandte Themen