Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何自定义渲染器?_C#_Xamarin_Xamarin.forms_Webview_Offline - Fatal编程技术网

C# 如何自定义渲染器?

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

我正在与Xamarin WebView合作,希望我的Xamarin应用程序在离线时仍能加载网站

是否知道Xamarin Webview在脱机时加载网站


我一直在搜索这个,我只看到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" />