Xamarin中Render的使用

Render意为渲染,在Xamarin.Forms中,由于目前还不成熟,很多View需要使用原生平台,那么怎么做,才能使Forms里的View具有原生平台对应的特性呢,或者如何在Forms里使用到原生平台上的View呢,Render就可以帮我们做这些事情。如下是我的学习笔记,跟大家分享一下。以Entry为列。(后期随着Forms的不断完善,可能该例子会有些多余,但是今天的分享主要是说明Render的使用)

步骤1、在Forms里声明需要渲染的类,继承View或其子类。

   public class RenderEntry : Entry
    {
        public static readonly BindableProperty TextFontProperty =
              BindableProperty.Create<RenderEntry, Font>(p => p.TextFont, Font.Default);

        public Font TextFont
        {
            get { return (Font)GetValue(TextFontProperty); }
            set { SetValue(TextFontProperty, value); }
        }
    }
上面的代码,继承Entry。因为Entry没有Font这个属性。所以这里定义一个TextFont属性(在原生平台上将渲染这个属性)


步骤2、在Android工程中实现对RenderEntry的渲染。

using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(RenderEntry), typeof(RenderEntry_Droid))]
namespace RenderStudy.Droid
{
     public class RenderEntry_Droid : EntryRenderer
    {
         RenderEntry sourceView ;
         EditText targetView;
         protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.View> e)
        {
            base.OnElementChanged(e);
            if (e.OldElement == null)
            {
                sourceView = (RenderEntry)e.NewElement;
                //EditText edit = new EditText(this.Context);
                targetView =(EditText)this.Control;
                targetView.SetTextSize(Android.Util.ComplexUnitType.Sp, sourceView.TextFont.ToScaledPixel());
            }
        }

         protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            if (e.PropertyName == RenderEntry.TextFontProperty.PropertyName)
            {
                targetView.SetTextSize(Android.Util.ComplexUnitType.Sp, sourceView.TextFont.ToScaledPixel());
            }
        }
     }  
}


步骤3、在iOS端实现渲染:

using Xamarin.Forms.Platform.iOS;
[assembly: ExportRenderer(typeof(RenderEntry), typeof(RenderEntry_iOS))]
namespace <span style="font-family: Arial, Helvetica, sans-serif;">RenderStudy</span><span style="font-family: Arial, Helvetica, sans-serif;">.iOS</span>
{
    public class RenderEntry_iOS : EntryRenderer
    {
        RenderEntry sourceView;
        UITextField targetView;
        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);
            if (e.OldElement == null)
            {
                sourceView = (RenderEntry)e.NewElement;
                targetView = (UITextField)Control;
           
                targetView.Font = sourceView.TextFont.ToUIFont();
            }
        }
     protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
     {
            base.OnElementPropertyChanged(sender, e);
            if (e.PropertyName == RenderEntry.HAlignmentProperty.PropertyName)
            {
<pre name="code" class="csharp">               targetView.Font = sourceView.TextFont.ToUIFont();
} }}

 

步骤4、使用TextFont属性。(跟其他属性一样的使用,不多做说明)


分享到这里,总结一下,发现在Forms里想要使用到原生平台的东西,有两种方法,一种就是今天分享的Render,还有一种就是DependencyService,前面已经分享过:点击打开链接


注意:直接对View进行渲染时,原生平台上应该继承ViewRender,然后需要设置本地View,SetNativeControl(targetView)。

Render不仅可以对View进行渲染,对Page也是可以进行渲染的,大家可以自己多试试。

欢迎大家添加我的QQ群(365516544)一起学习讨论



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值