更新 Xamarin.Forms 版本 5.0.0.1874 后显示空格的 Web 视图

问题描述

我们使用自定义渲染器在 Xamarin.Forms 中使用 WebView。当我们在我们的解决方案中将 Xamarin.Forms 版本从 4.7.0.1260 更新到 5.0.0.1874 时,它会在 WebView 内容的末尾显示空格。它在 Xamarin.Forms 版本 4.7.0.1260 中运行良好。我们也尝试过最新版本的 Xamarin.Forms,但也有同样的问题。在 Android 和 iOS 平台上均出现问题。

请检查以下代码是否相同。

---------//XAML//---------
<ScrollView>
<Grid>
    <Grid.RowDeFinitions>
        <RowDeFinition Height="*"/>
    </Grid.RowDeFinitions>
    <local:ExtendedWebviewmodel x:Name="AppWebView"                                                        
                            Grid.Row="0"
                            HorizontalOptions="FillAndExpand"
                            VerticalOptions="FillAndExpand"/>
</Grid>
</ScrollView>



---------//cs//-----------


// xaml cs file code

AppWebView.source = new HtmlWebViewSource
{
    Html = @"<!DOCTYPE html><html><head><Meta name='viewport' content='width=device-width,initial-scale=1.0,maximum-scale=5.0,minimum-scale=1.0,user-scalable=no'><style> *{ font-size:12px; font-family: Verdana !important; }</style></head><body>" + System.Net.WebUtility.HtmlDecode(content) + @"</body></html>",};


// ExtendedWebviewmodel

using Xamarin.Forms;

namespace EmployeeApp.viewmodel
{
    public class ExtendedWebviewmodel : WebView
    {
    }
}



---------//Android Custom Renderer//--------


using Android.Content;
using Android.Webkit;
using EmployeeApp.Droid;
using EmployeeApp.viewmodel;
using Plugin.FirebaseCrashlytics;
using System;
using System.Reflection;
using Xamarin.Essentials;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using WebView = Android.Webkit.WebView;

[assembly: ExportRenderer(typeof(ExtendedWebviewmodel),typeof(ExtendedWebVieWrenderer))]
namespace EmployeeApp.Droid
{
    public class ExtendedWebVieWrenderer : WebVieWrenderer
    {
        static ExtendedWebviewmodel _xwebView = null;
        WebView _webView;

        public ExtendedWebVieWrenderer(Context context) : base(context)
        {
        }

        class ExtendedWebViewClient : Android.Webkit.WebViewClient
        {
            public override async void OnPageFinished(WebView view,string url)
            {
                try
                {
                    if (_xwebView != null)
                    {
                        int i = 10;
                        while (view.ContentHeight == 0 && i-- > 0) // wait here till content is rendered
                            await System.Threading.Tasks.Task.Delay(100);
                        _xwebView.HeightRequest = view.ContentHeight;
                    }
                    base.OnPageFinished(view,url);
                }
                catch (Exception ex)
                {
                    CrossFirebaseCrashlytics.Current.Log(string.Format("SessionID : {0},Pagename : {1},Methodname : {2},Error :  {3}",App.SessionID,MethodBase.GetCurrentMethod().ReflectedType.FullName,MethodBase.GetCurrentMethod().Name,ex.Message)); CrossFirebaseCrashlytics.Current.RecordException(ex);
                }
            }
            
            public override bool ShouldOverrideUrlLoading(WebView view,IWebResourceRequest request)
            {
                bool value = true;
                try
                {
                    Android.Net.Uri url = request.Url;
                    if (Convert.ToString(url).StartsWith("http"))
                    {
                        var uri = new Uri(Convert.ToString(url));
                        Launcher.OpenAsync(uri);
                        value = true;
                    }
                }
                catch (Exception ex)
                {
                    CrossFirebaseCrashlytics.Current.Log(string.Format("SessionID : {0},ex.Message)); CrossFirebaseCrashlytics.Current.RecordException(ex);
                }
                return value;
            }

        }

        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
        {
            try
            {
                base.OnElementChanged(e);
                _xwebView = e.NewElement as ExtendedWebviewmodel;
                _webView = Control;

                if (e.OldElement == null)
                {
                    _webView.SetWebViewClient(new ExtendedWebViewClient());
                }
            }
            catch (Exception ex)
            {
                CrossFirebaseCrashlytics.Current.Log(string.Format("SessionID : {0},ex.Message)); CrossFirebaseCrashlytics.Current.RecordException(ex);
            }
        }
    }
}


---------//iOS Custom Renderer//--------


using System;
using System.Reflection;
using EmployeeApp.iOS;
using EmployeeApp.viewmodel;
using Plugin.FirebaseCrashlytics;
using UIKit;
using WebKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(ExtendedWebviewmodel),typeof(ExtendedWebVieWrenderer))]
namespace EmployeeApp.iOS
{
    public class ExtendedWebVieWrenderer : WkWebVieWrenderer
    {
        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            try
            {
                base.OnElementChanged(e);
                NavigationDelegate = new AppWKNavigationDelegate(this);
            }
            catch (Exception ex)
            {
                
            }
        }
    }

    public class AppWKNavigationDelegate : WKNavigationDelegate
    {
        readonly ExtendedWebVieWrenderer extendedWebVieWrenderer;
        public AppWKNavigationDelegate(ExtendedWebVieWrenderer _extendedWebVieWrenderer)
        {
            try
            {
                extendedWebVieWrenderer = _extendedWebVieWrenderer ?? new ExtendedWebVieWrenderer();
            }
            catch (Exception ex)
            {
                
            }
        }

        public override async void DidFinishNavigation(WKWebView webView,WKNavigation navigation)
        {
            try
            {
                if (extendedWebVieWrenderer.Element is ExtendedWebviewmodel extendedWebviewmodel)
                {
                    if (webView != null)
                    {
                        //string javascript = string.Format(@"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '{0}'","250%");
                        //WKJavascriptEvaluationResult handler = (NSObject result,NSError err) => { };
                        //webView.EvaluateJavaScript(javascript,handler);
                        await System.Threading.Tasks.Task.Delay(100); // wait here till content is rendered
                        if (webView.ScrollView != null)
                        {
                            if (webView.ScrollView.ContentSize != null)
                            {
                                extendedWebviewmodel.HeightRequest = (double)webView.ScrollView.ContentSize.Height;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
               
            }
        }

        public override void DecidePolicy(WKWebView webView,WKNavigationAction navigationAction,Action<WKNavigationActionPolicy> decisionHandler)
        {
            try
            {
                if (navigationAction != null)
                {
                    if (navigationAction.NavigationType == WKNavigationType.LinkActivated)
                    {
                        if (navigationAction.Request != null)
                        {
                            if (navigationAction.Request.Url != null)
                            {
                                UIApplication.SharedApplication.OpenUrl(navigationAction.Request.Url);
                                decisionHandler(WKNavigationActionPolicy.Cancel);
                            }
                        }
                    }
                    else
                    {
                        decisionHandler(WKNavigationActionPolicy.Allow);
                    }
                }
            }
            catch (Exception ex)
            {
                
            }
        }
    }
}

任何人都可以检查并提供任何解决方案吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)