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());
}
}
}
}
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)一起学习讨论