Xamarin.forms Xamarin表单如何在Android和iOS的XAML文件中调用不同的呈现器
因此,我在Xamarin Forms应用程序中有一个WebView,但我希望通过创建自定义呈现程序来更改iOS WebView,如此处推荐的: 不过,我不知道如何修改我的XAML文件,调用我的iOS自定义渲染器,以及Android的普通WebView。当前我的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
<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)));
}
}
}
}