Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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
在Xamarin表单中实现自定义Webview_Xamarin_Xamarin.forms_Webview_Xamarin.ios_Wkwebview - Fatal编程技术网

在Xamarin表单中实现自定义Webview

在Xamarin表单中实现自定义Webview,xamarin,xamarin.forms,webview,xamarin.ios,wkwebview,Xamarin,Xamarin.forms,Webview,Xamarin.ios,Wkwebview,我是Xamarin.Forms的新手,我在Droid项目中实现了一个自定义的web视图渲染器 问题是在iOSproject中实现渲染器时,就好像Webview是在不加载CSS和Javascript的情况下初始化的。因为它只显示HTML页面,没有任何功能 经过一些研究,我知道我们必须实现WKWebviewRenderer,我们必须在iOS中加载LoadFileUrl方法,但我仍然无法在渲染器中捕获url 任何人都知道如何将以下Android渲染器代码实现为iOS渲染器 Droid项目中的自定义渲染

我是Xamarin.Forms的新手,我在Droid项目中实现了一个自定义的web视图渲染器

问题是在
iOS
project中实现渲染器时,就好像
Webview
是在不加载CSS和Javascript的情况下初始化的。因为它只显示
HTML
页面,没有任何功能

经过一些研究,我知道我们必须实现
WKWebviewRenderer
,我们必须在
iOS
中加载
LoadFileUrl
方法,但我仍然无法在渲染器中捕获url

任何人都知道如何将以下
Android渲染器
代码实现为
iOS渲染器

Droid项目中的自定义渲染器:

[assembly: ExportRenderer(typeof(Xamarin.Forms.WebView), typeof(MyProject.Droid.WebViewRenderer))]
namespace MyProject.Droid
{
    public class WebViewRenderer : Xamarin.Forms.Platform.Android.WebViewRenderer
    {
        private bool isMyCustomWebview = false;
        public IWebViewController ElementController => Element;

        protected override void OnElementChanged(Xamarin.Forms.Platform.Android.ElementChangedEventArgs<Xamarin.Forms.WebView> e)
        {
            base.OnElementChanged(e);
            if (e.NewElement.GetType() == typeof(MyCustomWebview))
            {
                Control.SetWebViewClient(new Callback(this));
                isMyCustomWebview = true;
            }
            else
            {
                Control.SetWebViewClient(new Callback(Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity));
                isMyCustomWebview = false;
            }
        }


        public class Callback : WebViewClient
        {
            Activity _context;
            public Callback(Activity _context)
            {
                this._context = _context;
            }

            WebViewRenderer _renderer;

            public Callback(WebViewRenderer renderer)
            {
                _renderer = renderer ?? throw new ArgumentNullException("Renderer");
            }

            public override void OnPageStarted(Android.Webkit.WebView view, string url, Android.Graphics.Bitmap favicon)
            {
                base.OnPageStarted(view, url, favicon);
                if (_renderer != null && _renderer.isMyCustomWebview)
                {
                    DependencyService.Get<ILoadingIndicator>().Show();
                    var args = new WebNavigatingEventArgs(WebNavigationEvent.NewPage, new UrlWebViewSource { Url = url }, url);
                    _renderer.ElementController.SendNavigating(args);
                }

            }
            public override void OnPageFinished(Android.Webkit.WebView view, string url)
            {
                base.OnPageFinished(view, url);
                if (_renderer != null && _renderer.isMyCustomWebview)
                {
                    DependencyService.Get<ILoadingIndicator>().Dismiss();
                    var source = new UrlWebViewSource { Url = url };
                    var args = new WebNavigatedEventArgs(WebNavigationEvent.NewPage, source, url, WebNavigationResult.Success);
                    _renderer.ElementController.SendNavigated(args);
                }
            }
        }
    }
}
[assembly: ExportRenderer(typeof(Xamarin.Forms.WebView), typeof(MyProject.iOS.WebViewRenderer))]
namespace MyProject.iOS
{
    // Xamarin.Forms.Platform.iOS.WebViewRenderer
    public class WebViewRenderer : ViewRenderer<WebView, WKWebView>
    {
        WKWebView wkWebView;

        protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
        {
            base.OnElementChanged(e);
            if (Control != null) return;
            var config = new WKWebViewConfiguration();
            wkWebView = new WKWebView(Frame, config) { NavigationDelegate = new MyNavigationDelegate() };
            SetNativeControl(wkWebView);
        }
    }

    public class MyNavigationDelegate : WKNavigationDelegate
    {
        public override void DidFinishNavigation(WKWebView webView, WKNavigation navigation)
        {

            //get url here
            var url = webView.Url;

            // webView.LoadFileUrl(url, url);

        }
    }
}

您可以修改自定义渲染器的代码,如下所示

[assembly: ExportRenderer(typeof(WebView), typeof(MyWebViewRenderer))]
namespace xxx.iOS
{

    public class MyWebViewRenderer : ViewRenderer<WebView, WKWebView>
    {
        WKWebView wkWebView;

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

            if (Control != null) return;
            var config = new WKWebViewConfiguration();
            wkWebView = new WKWebView(Frame, config) { NavigationDelegate = new MyNavigationDelegate() };
            SetNativeControl(wkWebView);
        }
    }

    public class MyNavigationDelegate : WKNavigationDelegate
    {
        public override void DidFinishNavigation(WKWebView webView, WKNavigation navigation)
        {

            //get url here
            var url = webView.Url;

            //webView.LoadFileUrl();

        }
    }
}
[程序集:ExportRenderer(typeof(WebView)、typeof(MyWebViewRenderer))]
命名空间xxx.iOS
{
公共类MyWebViewRenderer:ViewRenderer
{
WKWebView WKWebView;
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(Control!=null)返回;
var config=新的WKWebViewConfiguration();
wkWebView=newwkwebview(框架,配置){NavigationDelegate=newmynavigationdelegate()};
SetNativeControl(wkWebView);
}
}
公共类MyNavigationDelegate:WKNavigationDelegate
{
公共覆盖无效DidFinishNavigation(WKWebView、WKNavigation导航)
{
//在此处获取url
var url=webView.url;
//LoadFileUrl();
}
}
}
iOS渲染器:

using WebKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(WebView), typeof(MyNamespace.iOS.MyWebViewRenderer))]
namespace MyNamespace.iOS
{
  //WkWebViewRenderer inherits from WKWebView
  public class MyWebViewRenderer : WkWebViewRenderer
  {
    protected override void OnElementChanged(VisualElementChangedEventArgs e)
    {
        base.OnElementChanged(e);

        if (e.NewElement != null)
        {
            WKWebView wkWebView = this;
            wkWebView.NavigationDelegate = new MyNavigationDelegate(); //not shown here
        }
    }
  }
}

现在将显示一个白色页面。我在
didfishnavigation
中添加了一个断点,它从未被击中。这就像它永远不会完成导航一样,我想我会更新这个问题,只是为了告诉你我是如何设置webview源代码的,也许初始化时出了问题。为了给你所有的细节,我们添加了BView初始化代码。你能分享整个示例吗?这样我就可以测试它了?你可以创建一个包含问题的示例。
using WebKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(WebView), typeof(MyNamespace.iOS.MyWebViewRenderer))]
namespace MyNamespace.iOS
{
  //WkWebViewRenderer inherits from WKWebView
  public class MyWebViewRenderer : WkWebViewRenderer
  {
    protected override void OnElementChanged(VisualElementChangedEventArgs e)
    {
        base.OnElementChanged(e);

        if (e.NewElement != null)
        {
            WKWebView wkWebView = this;
            wkWebView.NavigationDelegate = new MyNavigationDelegate(); //not shown here
        }
    }
  }
}