Xamarin.forms Xamarin表单如何在Android和iOS的XAML文件中调用不同的呈现器

Xamarin.forms Xamarin表单如何在Android和iOS的XAML文件中调用不同的呈现器,xamarin.forms,Xamarin.forms,因此,我在Xamarin Forms应用程序中有一个WebView,但我希望通过创建自定义呈现程序来更改iOS WebView,如此处推荐的: 不过,我不知道如何修改我的XAML文件,调用我的iOS自定义渲染器,以及Android的普通WebView。当前我的XAML文件如下所示: <WebView Source="{Binding StartUrl}" Navigated="OnBrowserNavigated" Navigat

因此,我在Xamarin Forms应用程序中有一个WebView,但我希望通过创建自定义呈现程序来更改iOS WebView,如此处推荐的:

不过,我不知道如何修改我的XAML文件,调用我的iOS自定义渲染器,以及Android的普通WebView。当前我的XAML文件如下所示:

<WebView Source="{Binding StartUrl}"
               Navigated="OnBrowserNavigated"
               Navigating="OnBrowserNavigating"
               AbsoluteLayout.LayoutFlags="All"
               AbsoluteLayout.LayoutBounds="0.5, 0.5, 1, 1"/>
我应该如何像页面上说的那样调用这个渲染器

<StackLayout>
    <local:MyWebView Url="https://www.microsoft.com" VerticalOptions="FillAndExpand"/>
</StackLayout>
仍然像我的XAML页面现在正在做的那样调用android的Xamarin.Forms.WebView?

由于Url属性是您在MyWebView中定义的,如果删除MyWebView类,它将抛出未定义错误

<WebView Source="{Binding StartUrl}"
         Url="{Binding StartUrl}"
               ...>
如果要在Android和ios中同时使用Source属性,则无法定义自定义webview,并在ios中直接使用渲染器中的webview,如:

// Create custom renderer:
[assembly: ExportRenderer(typeof(WebView), typeof(MyWebViewRenderer))]
namespace WKWebViewDemo.iOS
{
  public class MyWebViewRenderer : ViewRenderer<WebView, WKWebView>
  {
    WKWebView _wkWebView;
    protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
    {
        base.OnElementChanged(e);

        if (Control == null)
        {
            var config = new WKWebViewConfiguration();
            _wkWebView = new WKWebView(Frame, config);
            SetNativeControl(_wkWebView);
        }
        if (e.NewElement != null)
        {
            Control.LoadRequest(new NSUrlRequest(new NSUrl(((UrlWebViewSource)Element.Source).Url)));
        }
    }
  }
}

如果Android上没有定义自定义渲染器,它将只使用基本渲染器OK,因此如果我只使用MyWebView类,Xamarin将在Android应用程序中查找它,但由于它不存在,它将忽略它并使用Xamarin.Forms.WebView?它将查找渲染器。如果MyWebView没有一个,它将查找基类WebView中的一个。好的,所以我的android WebView将使用source=url,而iOS将使用url=url,就像你在问题中看到的那样,我会将它们都添加到我的XAML布局中吗?不,这将是一个问题。两个平台都需要具有相同的API表面。为什么您需要一个不同于基控件的url属性?它不起作用,但是,我怀疑我可能必须将UrlProperty重命名为SourceProperty?但是如果我这样做,它会抛出一个警告,说除非我添加新关键字,否则它将使用常规的Xamarin.Forms.WebView.Source。。这违背了此customrenderer的目的,对吗?如果源代码已经存在于基本控件中,则无需重新定义源代码。是的,因此我删除了MyWebView类并保留了该呈现程序,但现在呈现程序中出现了一个错误,control.LoadRequestnew NSUrlRequestnew Nsurlement.Url;,其中指出Element.Url中的Url不是由WebView定义的。好的,这就是我需要从UI传输到WkWebView的所有代码吗?或者我需要从这里复制所有这些代码:?
namespace Apm.Mobile.Core.Controls
{
public class BetterWebView : WebView
{
    public static readonly BindableProperty UrlProperty = BindableProperty.Create(
        propertyName: "Source", // This is now source instead of Url
        returnType: typeof(string),
        declaringType: typeof(BetterWebView),
        defaultValue: default(string));

    public new string Source // This string is now Source instead of Url
    {
        get { return (string)GetValue(UrlProperty); }
        set { SetValue(UrlProperty, value); }
    }
}
}
// Create custom renderer:
[assembly: ExportRenderer(typeof(WebView), typeof(MyWebViewRenderer))]
namespace WKWebViewDemo.iOS
{
  public class MyWebViewRenderer : ViewRenderer<WebView, WKWebView>
  {
    WKWebView _wkWebView;
    protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
    {
        base.OnElementChanged(e);

        if (Control == null)
        {
            var config = new WKWebViewConfiguration();
            _wkWebView = new WKWebView(Frame, config);
            SetNativeControl(_wkWebView);
        }
        if (e.NewElement != null)
        {
            Control.LoadRequest(new NSUrlRequest(new NSUrl(((UrlWebViewSource)Element.Source).Url)));
        }
    }
  }
}