首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xamarin Forms如何在Android和iOS的XAML文件中调用不同的渲染器

Xamarin Forms如何在Android和iOS的XAML文件中调用不同的渲染器
EN

Stack Overflow用户
提问于 2020-02-08 04:36:05
回答 2查看 115关注 0票数 0

因此,我在我的Xamarin Forms应用程序中有一个WebView,但是我想通过创建一个自定义的呈现程序来更改我的iOS WebView,如下所推荐的:https://forums.xamarin.com/discussion/129626/how-does-one-implement-wkwebview-ios-in-a-cross-platform-application

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

代码语言:javascript
复制
<WebView Source="{Binding StartUrl}"
               Navigated="OnBrowserNavigated"
               Navigating="OnBrowserNavigating"
               AbsoluteLayout.LayoutFlags="All"
               AbsoluteLayout.LayoutBounds="0.5, 0.5, 1, 1"/>

它使用关键字WebView (Xamarin.Forms.WebView)。但如果我使用此方法为iOS创建自定义渲染器:

代码语言:javascript
复制
// Create a new class:
public class MyWebView : WebView
{
    public static readonly BindableProperty UrlProperty = BindableProperty.Create(...);
    ...
}

// Create custom renderer:
[assembly: ExportRenderer(typeof(MyWebView), typeof(MyWebViewRenderer))]
namespace WKWebViewDemo.iOS
{
...    
}

我该如何像页面上说的那样调用这个渲染器呢

代码语言:javascript
复制
<StackLayout>
    <local:MyWebView Url="https://www.microsoft.com" VerticalOptions="FillAndExpand"/>
</StackLayout>

仍然像我的XAML页面那样调用android的Xamarin.Forms.WebView吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-10 11:26:09

因为Url属性是您在MyWebView中定义的,所以如果您删除MyWebView类,它将抛出not defined错误。

如果你想同时在安卓和ios中使用Source属性,你不能定义一个自定义的webview,直接在ios中使用渲染器中的WebView,就像这样:

代码语言:javascript
复制
// 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)));
        }
    }
  }
}
票数 1
EN

Stack Overflow用户

发布于 2020-02-08 05:23:36

代码语言:javascript
复制
<WebView Source="{Binding StartUrl}"
         Url="{Binding StartUrl}"
               ...>

所以这确实起作用了,iOS WebView运行得很好,但是我想要删除网址并使用“源”的方式是这样的。

代码语言:javascript
复制
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); }
    }
}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60120697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档