在Xamarin.Forms中,WebView如果嵌套在StackLayout和RelativeLayout中必須要設置HeightRequest和WidthRequest屬性才會進行渲染。可是在實際項目中往往WebView內容是不固定的,就造成了設置了HeightRequest和WidthRequ ...
在Xamarin.Forms中,WebView如果嵌套在StackLayout和RelativeLayout中必須要設置HeightRequest和WidthRequest屬性才會進行渲染。可是在實際項目中往往WebView內容是不固定的,就造成了設置了HeightRequest和WidthRequest後顯示效果不理想,不是高了就是短了,很影響用戶體驗,那麼就必須要自適應網頁的高度才行。
首先在共用庫中的添加XamWebView類:
public class XamWebView: WebView {}
然後使用它:
var webview= new XamWebView();
webview.HorizontalOptions = LayoutOptions.Fill;
webview.VerticalOptions = LayoutOptions.StartAndExpand;
//給個預設的高度和寬度
webview.WidthRequest = 300;
webview.HeightRequest = 300;
webview.Source = "https://www.cnblogs.com/";
然後在IOS中,你需要使用自定義的委托:
[assembly: ExportRenderer (typeof(XamWebView), typeof(XamWebViewRenderer))]
namespace Core.iOS
{
public class XamWebViewRenderer : WebViewRenderer
{
protected override void OnElementChanged (VisualElementChangedEventArgs e)
{
base.OnElementChanged (e);
Delegate = new XamUIWebViewDelegate (this);
}
}
}
然後用非同步和小延遲重寫LoadFinished以獲取整個ContentSize.Height(如果內容較大,即使載入完成後也需要一些時間才能呈現)
public class XamUIWebViewDelegate : UIWebViewDelegate
{
XamWebViewRenderer webViewRenderer;
public XamUIWebViewDelegate (XamWebViewRenderer _webViewRenderer = null)
{
webViewRenderer = _webViewRenderer ?? new XamWebViewRenderer ();
}
public override async void LoadingFinished (UIWebView webView)
{
var wv = webViewRenderer.Element as XamWebView;
if (wv != null) {
await System.Threading.Tasks.Task.Delay (100); // 這裡的時間可以調整
wv.HeightRequest = (double)webView.ScrollView.ContentSize.Height;
}
}
}
在Android中,您需要使用自定義的Android.Webkit.WebViewClient:
using WebView = Android.Webkit.WebView;
[assembly: ExportRenderer (typeof(XamWebView), typeof(XamWebViewRenderer))]
namespace Core.Droid
{
public class XamWebViewRenderer : WebViewRenderer
{
static XamWebView _xwebView = null;
WebView _webView;
public XamWebViewRenderer(Context context) : base(context)
{
}
class XamWebViewClient : Android.Webkit.WebViewClient
{
public override async void OnPageFinished(WebView view, string url)
{
if (_xwebView != null)
{
int i = 10;
while (view.ContentHeight == 0 && i-- > 0)
await System.Threading.Tasks.Task.Delay(100);// 這裡的時間可以調整
_xwebView.HeightRequest = view.ContentHeight;
}
}
}
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
{
base.OnElementChanged(e);
_xwebView = e.NewElement as XamWebView;
_webView = Control;
if (e.OldElement == null)
{
_webView.SetWebViewClient(new XamWebViewClient());
}
}
}
}
放一張Android截圖: