1. 创建

     

    一个Xamarin.Forms自定义控件。

 
 

自定义Entry控件可以通过继承来创建Entry控制,显示在下面的代码示例:

public
class
MyEntry : Entry { }

 
 

  1. 消费

     

    从Xamarin.Forms自定义控件。

该MyEntry控制可在XAML通过宣布其位置的命名空间,使用控制元素的命名空间前缀引用在PCL项目。 下面的代码示例显示了如何MyEntry控制可以通过一个XAML页面消耗:

<ContentPage ...

xmlns:local="clr-namespace:CustomRenderer;assembly=CustomRenderer"

...>

...

<local:MyEntry
Text="In Shared Code"
/>

...

</ContentPage>

在local名称空间前缀可以任意取名。 然而, clr-namespace和assembly值必须自定义控件的细节相匹配。 一旦命名空间声明的前缀用于引用自定义控制。下面的代码示例显示了如何MyEntry控制可以通过一个C#页面消耗:

public
class
MainPage : ContentPage

{

public
MainPage ()

{

Content
=
new
StackLayout {

Children
= {

new
Label {

Text
=
"Hello, Custom Renderer !",

},

new
MyEntry {

Text
=
"In Shared Code",

}

},

VerticalOptions
=
LayoutOptions.CenterAndExpand,

HorizontalOptions
=
LayoutOptions.CenterAndExpand,

};

}

}

此代码实例化一个新ContentPage对象,将显示一个Label ,并MyEntry控制在页面上居中垂直和水平。

自定义渲染器现在可以添加到每个应用程序项目,以定制控件的每个平台上亮相。

  1. 创建

     

    为每个平台上的控制自定义渲染器

3.1 创建的子类EntryRenderer呈现本地控制类。

3.2 覆盖OnElementChanged呈现本机控制方法和编写逻辑来定制控制。 建立相应的Xamarin.Forms控制时,此方法被调用。

3.3 一个添加ExportRenderer属性自定义渲染类来指定,它11会被用来渲染Xamarin.Forms控制。 这个属性是用来注册Xamarin.Forms定制的渲染器。

它是可选的,以提供在每个平台项目定制渲染器。 如果自定义渲染器没有被注册,那么将使用该控件的基类的默认渲染。

下图说明在示例应用程序的每个项目的责任,与他们之间的关系一起:

该MyEntry控制是通过特定于平台的呈现MyEntryRenderer类,全部由获得EntryRenderer每个平台类。 这导致每个MyEntry控制正在呈现与特定于平台的背景颜色,显示在下面的截图:

该EntryRenderer类公开OnElementChanged方法,以使相应的本地控制在创建Xamarin.Forms控制时被调用。 该方法获取ElementChangedEventArgs包含参数OldElement和NewElement属性。 这些属性代表了Xamarin.Forms元素渲染器附着于和Xamarin.Forms元素渲染器分别连接到。 在示例应用程序的OldElement属性将为null和NewElement属性将包含的参考MyEntry控制。

在一个重写版本OnElementChanged的方法MyEntryRenderer类是执行本机控制定制的地方。 类型化参考本地控制平台上使用可通过访问Control特性。 此外,向Xamarin.Forms控制的基准是的被呈现可通过获得Element属性,尽管它不是在示例应用程序使用。

每个自定义渲染器类装饰着ExportRenderer的注册与Xamarin.Forms渲染属性。 该属性有两个参数 - 所呈现的Xamarin.Forms控件的类型名称,自定义渲染器的类型名称。 该assembly前缀属性指定属性适用于整个组件。

以下各节讨论每个特定平台的实施MyEntryRenderer定制渲染器类。

创建iOS上的自定义呈现

下面的代码示例显示了iOS平台的自定义呈现:

using
Xamarin.Forms.Platform.iOS;

 
 

[assembly: ExportRenderer (typeof(MyEntry), typeof(MyEntryRenderer))]

namespace
CustomRenderer.iOS

{

public
class
MyEntryRenderer : EntryRenderer

{

protected
override
void
OnElementChanged (ElementChangedEventArgs<Entry> e)

{

base.OnElementChanged (e);

 
 

if (Control
!=
null) {

// do whatever you want to the UITextField here!

Control.BackgroundColor
=
UIColor.FromRGB (204, 153, 255);

Control.BorderStyle
=
UITextBorderStyle.Line;

}

}

}

}

基类的调用OnElementChanged方法实例在iOS UITextField控制,对控制的引用被分配到渲染器的Control性能。 然后将背景颜色设置为浅紫色与UIColor.FromRGB方法。

创建Android上的自定义呈现

下面的代码示例显示了Android平台定制的渲染器:

using
Xamarin.Forms.Platform.Android;

 
 

[assembly: ExportRenderer (typeof(MyEntry), typeof(MyEntryRenderer))]

namespace
CustomRenderer.Android

{

class
MyEntryRenderer : EntryRenderer

{

protected
override
void
OnElementChanged (ElementChangedEventArgs<Entry> e)

{

base.OnElementChanged (e);

 
 

if (Control
!=
null) {

Control.SetBackgroundColor (global::Android.Graphics.Color.LightGreen);

}

}

}

}

基类的调用OnElementChanged方法实例化一个Android EditText控制,对控制的引用被分配到渲染器的Control性能。 然后将背景颜色设置为浅绿色与Control.SetBackgroundColor方法。

写在后边的话

为了符合要求,需要有边框效果所以参考资料如下:

https://forums.xamarin.com/discussion/18056/border-radius-and-border-on-entry

上代码"

using Xamarin.Forms.Platform.Android;
using Xamarin.Forms;
using CustomRenderer;
using Android.Graphics.Drawables;

[assembly: ExportRenderer (typeof(MyEntry), typeof(MyEntryRenderer))]
namespace CustomRenderer
{
    class
MyEntryRenderer : EntryRenderer
    {
        protected
override
void OnElementChanged (ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged (e);

            if (Control != null) {
                GradientDrawable gd = new
GradientDrawable();
                gd.SetColor(Android.Graphics.Color.Green);
                gd.SetCornerRadius(10);
                gd.SetStroke(10, Android.Graphics.Color.LightGray);//边框宽度和边框颜色
                this.Control.SetBackgroundDrawable(gd);
            }
        }
    }
}

 
 

  

自定义xamarin.forms Entry 背景色以及边框的更多相关文章

  1. Xamarin.Forms 自定义控件(呈现器和效果)

    Xamarin.Forms 使用目标平台的本机控件呈现用户界面,从而让 Xamarin.Forms 应用程序为每个平台保留了相应的界面外观.凭借效果,无需进行自定义呈现器实现,即可自定义每个平台上的本 ...

  2. Xamarin.Forms 简介

    An Introduction to Xamarin.Forms 来源:http://developer.xamarin.com/guides/cross-platform/xamarin-forms ...

  3. Xamarin.Forms入门-使用 Xamarin.Forms 来创建跨平台的用户界面

    Xamarin.Forms 是一个跨平台的.基于原生控件的UI工具包,开发人员可以轻松的创建适用于 Android,iOS 以及 Windows Phone的用户界面.Xamarin.Forms 通过 ...

  4. Xamarin.Forms 开发资源集合(复制)

    复制:https://www.cnblogs.com/mschen/p/10199997.html 收集整理了下 Xamarin.Forms 的学习参考资料,分享给大家,稍后会不断补充: UI样式 S ...

  5. Xamarin.Forms 开发资源集合

    收集整理了下 Xamarin.Forms 的学习参考资料,分享给大家,稍后会不断补充: UI样式 Snppts: Xamarin Forms UI Snippets. Prebuilt Templat ...

  6. Xamarin Forms:小马过河,王者归来

    因为我媳妇的原因,去年下半年从零开始学习Android原生开发,做了一个答题库app.整体给我的感觉是入门难度不大,前期折腾一番,大部分时间都是花在开发上面,其实任何一门语言都是如此. 今年我又有另一 ...

  7. Xamarin.forms 自定义tabview控件

    一 问题描述 forms本身ui代码是翻译为平台原生代码,forms按照xaml技术进行对android和ios两种ui模型进行公共抽象出了几种page和view,在空杯博客已经有详细介绍 http: ...

  8. Xamarin.Forms 自定义 TapGestureRecognizer 附加属性

    While creating Xamarin.Forms applications, definitely you are going to need TapGestureRecognizer oft ...

  9. Xamarin.Forms之样式

    使用XAML样式设置Xamarin.Forms应用的样式Xamarin.Forms应用程序的样式传统上是通过使用Style类将一组属性值分组到一个对象中来完成的,然后可以将其应用于多个视觉元素实例. ...

随机推荐

  1. MyISAM与InnoDB的区别

    1. 存储结构: MyISAM:(文件名以表名开始) .frm文件存储表定义 .MYD文件存储数据 .MYI文件存储索引 InnoDB: 所有的表保存在同一个(也可能多个)数据文件中,表的大小仅受限于 ...

  2. 《Android开发艺术探索》读书笔记 (3) 第3章 View的事件体系

    本节和<Android群英传>中的第五章Scroll分析有关系,建议先阅读该章的总结 第3章 View的事件体系 3.1 View基本知识 (1)view的层次结构:ViewGroup也是 ...

  3. Linux基础系列—Linux体系结构和Linux内核结构

    /** ****************************************************************************** * @author    暴走的小 ...

  4. TwoSAT算法模板

    该模板来自大白书 [解释] 给多个语句,每个语句为“ Xi为真(假) 或者 Xj为真(假)” 每个变量和拆成两个点 2*i为假, 2*i+1为真 “Xi为真 或 Xj为真”  等价于 “Xi为假 –& ...

  5. C#解leetcode 238. Product of Array Except Self

    Given an array of n integers where n > 1, nums, return an array output such that output[i] is equ ...

  6. C#中接口和抽象类

    1抽象类 (1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法 (2) 抽象类不能被实例化 (3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明 ...

  7. 刚入门的easyui

    这两天看了下easyui的教学先说说自己的一些小小理解吧! ----在使用easyui中也遇到了一个问题 : Uncaught TypeError:cannot call method ‘offset ...

  8. HDU3480

    题意:给你n个数,然后让你分成m个集合,每个集合有一个值(最大值减最小值,然后平方),求整个集合的可能最小值. 思路:因为每个集合里的值只和最大和最小值有关,所以很容易想到先排序,然后用DP可求得解, ...

  9. (转)PHP的ereg()与eregi()的不同及相同点。对比

    ereg() 字符串比对解析. 语法: int ereg(string pattern, string string, array [regs]); 返回值: 整数/数组 函数种类: 资料处理 内容说 ...

  10. SQL中 patindex函数的用法

    语法格式:PATINDEX ( '%pattern%' , expression ) 返回pattern字符串在表达式expression里第一次出现的位置,起始值从1开始算. pattern字符串在 ...