C# 如何自定义渲染器?
我正在与Xamarin WebView合作,希望我的Xamarin应用程序在离线时仍能加载网站 是否知道Xamarin Webview在脱机时加载网站C# 如何自定义渲染器?,c#,xamarin,xamarin.forms,webview,offline,C#,Xamarin,Xamarin.forms,Webview,Offline,我正在与Xamarin WebView合作,希望我的Xamarin应用程序在离线时仍能加载网站 是否知道Xamarin Webview在脱机时加载网站 我一直在搜索这个,我只看到Java Android网络视图,没有看到Xamarin表单我们可以使用自定义渲染器在iOS和Android上设置缓存模式 以形式 创建自定义Web视图 public class MyWebView : WebView { public static readonly BindableProperty UrlPr
我一直在搜索这个,我只看到Java Android网络视图,没有看到Xamarin表单我们可以使用自定义渲染器在iOS和Android上设置缓存模式 以形式 创建自定义Web视图
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
仅当不存在缓存数据时,才使用现有缓存数据,而不管其年龄或过期日期如何,从原始源加载
使用系统组件模型;
使用xxx;
使用xxx.iOS;
使用基础;
使用UIKit;
使用WebKit;
使用Xamarin.Forms;
使用Xamarin.Forms.Platform.iOS;
[程序集:ExportRenderer(typeof(MyWebView)、typeof(MyWebViewRenderer))]
命名空间xxx.iOS
{
公共类MyWebViewRenderer:ViewRenderer
{
WKWebView WKWebView;
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(Control==null)
{
var config=新的WKWebViewConfiguration();
_wkWebView=新的wkWebView(框架,配置);
SetNativeControl(_wkWebView);
}
}
受保护的覆盖无效OnElementPropertyChanged(对象发送方,PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(发送方,e);
如果(例如,PropertyName==“Url”)
{
NSUrlRequest-request=new-NSUrlRequest(new-NSUrl(Element.Url),NSUrlRequestCachePolicy.ReturnCacheDataElseLoad,5);
控制。加载请求(请求);
}
}
}
}
在Android中
使用Android.Content;
使用xxx;
使用xxx.Droid;
使用Xamarin.Forms;
使用Xamarin.Forms.Platform.Android;
[程序集:ExportRenderer(typeof(MyWebView)、typeof(MyWebViewRenderer))]
名称空间xxx.Droid
{
公共类MyWebViewRenderer:WebViewRenderer
{
公共MyWebViewRenderer(上下文):基础(上下文)
{
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(控件!=null)
{
Control.Settings.CacheMode=Android.Webkit.CacheModes.cachelsenetwork;
Control.Settings.JavaScriptEnabled=true;
}
}
}
}
现在您只需要在xaml中定义它,如下所示
<local:MyWebView Url="xxx" />
我添加了Control.LoadUrl(((MyWebView)元素).Url)行,否则不显示url。另外,OnElementPropertyChanged如果(e.property==url)
从来都不是真的,我将此块移动到iOS渲染器中的OnElementChanged方法。你有那个人的完整代码吗?我想研究你的代码,然后应用到我的应用程序,如果有什么改进,我是Xamarin表单的新手,还不知道自定义渲染器你可以参考。在Xaml文件中,我可以将Url的属性设置为“”??最后一个问题..网站的cookie也将附加???
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;
}
}
}
}
<local:MyWebView Url="xxx" />