创建扩展组件学习笔记---创建简单MXML组件

来源:互联网 发布:网络钓鱼演示 编辑:程序博客网 时间:2024/05/29 18:04

所有的可视组件都源自UIComponent类。Flex的非可视组件是作为类实现的。最常见的非可视组件是Validator,Formatter,Effect等。

你不能通过过定义一个变量重载一个继承的属性,但你能通过定义setter和getter方法来重载一个属性。你能重置一个继承属性的值通过定义一个变量。一般你在为一个ActionScript组件,在子类的构造函数里重置它,或在一个MXML组件里的事件处理函数里做,因为MXML组件不能定义构造函数。
然而,当你使用MXML,Flex编译器消耗更多的负载来为你创建这个组件的子类,毕竟,使用MXML更容易地创建组件。

使用MXML还是ActionScript创建组件
两种方法实质上都是在定义一个新的ActionScript类。
修改已有组件的一些行为,增加一些基本特性,那在MXML里创建是简单快速的。
如果新组件是其它组件的组合,并且你要设定它们的尺寸和位置,你应该使用MXML里定义它们。
修改组件的行为,例如容器如何布局它的子对象,使用ActionScript。
想创建一个可视组件,直接是UIComponent的子类,使用ActionScript。
创建一个非可视的组件,如formatter,effect,使用ActionScript。
为你的控件增加日志支持,使用ActionScript。

MXML组件是一个MXML文件,你可以使用MXML标签在其它的MXML文件里引用它。
主应用的MXML文件里要为组件增加一个新的命名空间定义,这个命名空间定义了组件的位置。

一个混合组件是一个在内部包含了多个组件的组件。要创建一个混合组件,只需指定一个容器作为根标签,并增加FLEX组件作为它的子对象。
在创建自定义组件时,你也可在里边使用其它你已定义好的自定义组件。但要记得声明命名空间。

如果你创建一个包含子标签的自定义组件,你不能够在主应用里为它再增加子标签了。但若你的自定义组件只是定义了一个空的容器,你在其它MXML文件里使用这个组件时,你可为它添加子标签。
注:这个关于子标签的限制是针对可视组件的。你总是可以为非可视组件插入标签,如:ActionScript代码块,styles,effects,formatters,validators,和其他类型的非可视组件,不管你是怎样定义的你的定制组件的。

如:定义一个空组件
<?xml version="1.0"?>
<!-- mxml/EmptyForm.mxml -->

<mx:Form xmlns:mx="http://www.adobe.com/2006/mxml"/>
在主应用里使用它,并为它增加子对象:
<?xml version="1.0"?>
<!-- mxml/MainEmptyForm.mxml-->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    xmlns:MyComp="*">

    <MyComp:EmptyForm>   
        <mx:FormItem label="Name">
            <mx:TextInput/>
        </mx:FormItem>
    </MyComp:EmptyForm>

</mx:Application>

在主应用文件里,你可以引用定制组件实例的公有属性,但你不能引用该组件子对象的属性。如果,你要访问子对象,你要在定制组件里定义一些方法来传递。

定制组件中的作用域
在MXML的<mx:Script>标签中,this关键字总是指向当前scope。在主应用的MXML文件中,this关键字指向Application对象。在一个MXML组件中,this关键字指向根标签所定义的对象。
在组件定义文件中,你不能指定根标签的id属性,如果你要在组件定义中引用它,可用this关键字。

为定制组件应用样式
定制组件可以根本不包含样式,这样,将使用主应用的样式。也可带内置的样式,也可部分使用内置样式,部分使用主应用的样式。
在组件里指定样式例子:
1.使用标签属性
<?xml version="1.0"?>
<!-- mxml/myComponents/StateComboBoxWithStyleProps.mxml -->

<mx:ComboBox xmlns:mx="http://www.adobe.com/2006/mxml"
    openDuration="1000"
    fontSize="15">
。。。
2.使用类选择符
<?xml version="1.0"?>
<!-- mxml/myComponents/StateComboBoxWithStyleClassSel.mxml -->

<mx:ComboBox xmlns:mx="http://www.adobe.com/2006/mxml" styleName="myCBStyle">

    <mx:Style>
        .myCBStyle {
            openDuration : 1000;
            fontSize : 15;
            }
    </mx:Style>
。。。
但在MXML组件里不能使用一个类型选择符,编译器将会报错。
在主应用仍可指定组件的其他样式,如:
<MyComp:StateComboBoxWithStyleProps color="red"/>

在一个主应用MXML文件中,对于一个引用的MXML组件,你可以使用三种方法设定它的样式。
1.标签属性
<MyComp:StateComboBoxWithStyleProps openDuration="1000"/>
2.类选择符
<mx:Style>
        .myStateComboBox {
            openDuration : 1000;
        }
    </mx:Style>

    <MyComp:StateComboBoxWithStyleProps styleName="myStateComboBox"/>
3.类型选择符
<mx:Style>
        StateComboBoxWithStyleProps {
            openDuration : 1000;
        }
    </mx:Style>
一个MXML组件也是FLEX已有组件的子类,如果你用类型选择符指定的这个已有组件的样式,那么它也将影响这个MXML组件。
如果有一个父类的类型选择符,又有一个子类的类型选择符,而且冲突,那么将使用子类的类型选择符。


原创粉丝点击