问题描述
我们使用自定义渲染器在 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 (将#修改为@)