【问题标题】:Xamarin Forms WebView.CanGoBack always returns false on UWPXamarin Forms WebView.CanGoBack 在 UWP 上始终返回 false
【发布时间】:2017-11-18 10:12:48
【问题描述】:

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

我在 Android 中没有看到这个问题。

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

注意:我正在运行 XF v2.3.3.193

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

【问题讨论】:

    标签: xamarin uwp xamarin.forms


    【解决方案1】:

    我创建了一个代码示例,并在 WebView 浏览多个网站时重现了您的问题。而且我在Xamarin.Forms源代码中找到了原因。

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

    CanGoBack 属性将在调用 UpdateCanGoBackForward 方法时更改。而UpdateCanGoBackForward 方法仅在调用本机NavigationCompleted 事件时才被调用。因此,如果某些网站无法快速加载,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();
         }       
     }
    

    【讨论】:

    • 只是一个评论,虽然这确实修复了 UWP,但它破坏了 Android(因为我没有用于 droid 的自定义渲染器)。我不确定要在 Android 渲染器中做什么,所以我没有创建渲染器,而是做一个 RuntimePlatform 检查并根据平台检查 CCanGoBack 或 CanGoBack。
    猜你喜欢
    • 2021-07-22
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 2015-01-04
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多