【问题标题】:How custom renderer?如何自定义渲染器?
【发布时间】:2020-10-28 19:10:17
【问题描述】:

我正在使用 Xamarin WebView,并希望让我的 Xamarin 应用在离线时仍能加载网站。

关于离线时 Xamarin Webview 加载网站有什么想法吗?

我一直在寻找这个,我只看到 Java Android WebViews 而没有看到 Xamarin 表单

【问题讨论】:

标签: c# xamarin xamarin.forms webview offline


【解决方案1】:

我们可以在 iOS 和 Android 上使用 Custom Renderer 来设置 CacheMode。

在表单中

创建自定义 WebView

public class MyWebView : WebView
{
    public static readonly BindableProperty UrlProperty = BindableProperty.Create(
    propertyName: "Url",
    returnType: typeof(string),
    declaringType: typeof(MyWebView),
    defaultValue: default(string));

    public string Url
    {
        get { return (string)GetValue(UrlProperty); }
        set { SetValue(UrlProperty, value); }
    }
}

在 iOS 中

有一个 ReturnCacheDataElseLoad 缓存类型 NSUrlRequestCachePolicy 。您可以将值设置为 NSURLRequestReturnCacheDataElseLoad 。

使用现有的缓存数据,无论年龄或到期日期,仅在没有缓存数据时才从原始源加载。


using System.ComponentModel;

using xxx;
using xxx.iOS;
using Foundation;
using UIKit;
using WebKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly:ExportRenderer(typeof(MyWebView),typeof(MyWebViewRenderer))]
namespace xxx.iOS
{
    public class MyWebViewRenderer : ViewRenderer<MyWebView, WKWebView>
    {
        WKWebView _wkWebView;

        protected override void OnElementChanged(ElementChangedEventArgs<MyWebView> e)
        {
            base.OnElementChanged(e);

            if (Control == null)
            {
                var config = new WKWebViewConfiguration();
                _wkWebView = new WKWebView(Frame, config);
                SetNativeControl(_wkWebView);
            }
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            if (e.PropertyName == "Url")
            {
                NSUrlRequest request = new NSUrlRequest(new NSUrl(Element.Url), NSUrlRequestCachePolicy.ReturnCacheDataElseLoad, 5);
                Control.LoadRequest(request);               
            }
        }
    }
}

在安卓中


using Android.Content;

using xxx;
using xxx.Droid;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(MyWebView), typeof(MyWebViewRenderer))]
namespace xxx.Droid
{
    public class MyWebViewRenderer : WebViewRenderer
    {
        public MyWebViewRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
        {
            base.OnElementChanged(e);

            if(Control!=null)
            {
                Control.Settings.CacheMode = Android.Webkit.CacheModes.CacheElseNetwork;
                Control.Settings.JavaScriptEnabled = true;
            }

        }
    }
}

现在你只需要像下面这样在 xaml 中定义它

<local:MyWebView Url="xxx" />

【讨论】:

  • 你有那个人的完整密码吗?我想研究你的代码,如果有什么改进,就应用到我的应用中
  • 我是 Xamarin 表单的新手,还不了解自定义渲染器
  • 在 Xaml 文件中我可以将 Url 的属性设置为“website.com”??
  • 最后一个问题..网站的cookies也会附加???
【解决方案2】:

我在 Android 自定义渲染器中添加了 Control.LoadUrl(((MyWebView)Element).Url); 行,否则不会显示 url。 OnElementPropertyChanged if(e.property==url) 也不是真的我将此块移动到 iOS 渲染器中的 OnElementChanged 方法。

【讨论】:

    猜你喜欢
    • 2017-06-09
    • 1970-01-01
    • 2017-11-24
    • 2013-09-25
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 2023-03-25
    相关资源
    最近更新 更多