微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决更新 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 举报,一经查实,本站将立刻删除。