`

自定义的组件中加入多个MXML标记的子UI元素 (转)

    博客分类:
  • Flex
阅读更多
首先我们来看一下它定制的FORMITEM,单单看源代码,这个号称是FORMITEM的东西其实并没有从FORMITEM扩展,而是从HBOX扩展的,因此个人感觉是要装多少东西就装多少东西,看看作者在这故弄玄虚的背后到底要给我们讲解什么东西



FLEX不支持将子元件在多层水平上加入到组件容器里去,例如你就不能使用HBOX创建一个元件,然后再在其内部放入其他的元件,并用在其他地方,如果你尝试这么做,那么你得到一个运行时错误,说“Multiple sets of visual children have been specified for this component”该组件申明了多个可视的组件集合

看来一切果然是不能想当然的,再来看看作者是如何解决这个问题的。

FLEX不支持这样的原因是编译器实在不知道对于这些额外的组件应该如何处理,应为各种各样的冲突和特殊情况都会出现。

然而有几种方法可以避免这样的情况

只将MXML组件声明为叶子类,(无继承类)
在ACTIONSCRIPT里面声明组件而不是在MXML里面
在类文件里显式的处理MXML组件的传递,并且将组件放在合适的地方
方法3是最为灵活的,因此我们的作者也将以此为例子来为我们讲述如何使用这种方法来避免我们开头的情况





步骤一:在你的组件内部创建属性,这样MXML编译器就会将子组件付给这个组件,在例子中的如“children”属性,将传递给函数的值保存在一个全局变量中,以便在后面还可以获得使用,然后调用invalidateProperties() 函数,调用这个函数会引起FLEX在组件的后面某个阶段调用commitProperties() 函数,这样做很方便



步骤二:覆盖commitProperties() 函数,我们仅仅遍历那些传递给这个自定义组件的子组件,然后将他们正确的放入我们的容器中



步骤三:设置你在步骤一中创建的属性为此组件的默认属性,这意味着,我们在例子中定义的“children”属性会被自动的付给组件


<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml">    
    <!--
    * Set "children" to be the default property so we can easily set it from mxml
    -->
    <mx:Metadata>
        [DefaultProperty("children")]
    </mx:Metadata>           
    
    <mx:Script>
        <![CDATA[
    
            private var _children:Array = [];
            private var _childrenChanged:Boolean = false;                        
            
            /**
             * Set the &apos;content&apos; of this component, and then call invalidateProperties
             *
             * Note that if only one child is defined in mxml, then that child itself is passed in
             * If more than one child is defined, then an Array is passed in
             */
            public function set children( value:* ):void
            {
                if( value is DisplayObject )//这属于动态的类识别
                    _children = [ value ];
                else
                    _children = value;
                
                _childrenChanged = true;
                invalidateProperties();
            }
            
            public function get children():Array
            {
                return _children;
            }
            
            
            /**
             * During the commit properties phase is the best time to
             * add the children to their intended target
             */
            protected override function commitProperties():void
            {
                super.commitProperties();
                
                if( _childrenChanged )
                {
                    for each( var child:DisplayObject in _children )
                    {
                        b_content.addChild( child );
                    }
                }    
            }
                                               
            /**
             * These are just a few more properties to flesh out the example
             */
            [Bindable]
            private var _label:String;
            public override function set label( value:String ):void
            {
                _label = value; 
            }
            public override function get label():String
            {
                return _label;
            }
            
            [Bindable]
            private var _labelWidth:Number;
            public function set labelWidth( value:Number ):void
            {
                _labelWidth = value; 
            }
            public function get labelWidth():Number
            {
                return _labelWidth;
            }
            
        ]]>
    </mx:Script>    
    <mx:Label id="l_label" text="{_label}" width="{_labelWidth}" textAlign="right" />    
    <mx:Box id="b_content" direction="horizontal" horizontalGap="0" verticalAlign="middle" />    
</mx:HBox>



Things of note注意事项:

MXML编译器传递给你的'CHILDREN'的属性的值的类型将根据你声明的子组件的俄个数而变化,如果你只申明了一个子组件,那么此子组件将被传入此属性,如果多于一个子属性,那么值将被传递如数组
在commitProperties()函数被调用的过程中将子组件放到合适的位置是很方便的,首先因为这个函数在FLEX获得一些处理器空余时间时将被调用,这意味着其性能很好,其次这个函数要等到所有的子组件被创建后才被调用,无需处理这两者被容器交叉调用的竞爭条件,最后这个函数调用后,依次调用measure(),updatedisplaylist()这确保你的组件外观正确无误,这样完成了正确的放置子组件
[DefaultProperty]元数据标签必须嵌套在<mx:Metadata> 里面
使用这个方法,你就可以为你的自定义组件创建数个属性,使用这个方法你就可以使用MXML为组件添加数个子组件
分享到:
评论

相关推荐

    mxml2.0 源码

    6. **组件重用**:MXML支持自定义组件,开发者可以创建自己的组件库,然后在多个地方重复使用。这提高了代码的复用性和可维护性。 7. **Flex框架服务**:MXML 2.0源码还可能包含对Flex框架提供的服务的使用,如数据...

    Flex手机项目自定义List的ItemRenderer

    2. 在MXML标记中,可以声明并配置需要的组件,如Button,Image等。 3. 使用`data`属性来绑定这些组件的属性,以根据列表数据进行动态更新。 4. 记得在MXML文件中设置ID,以便在ActionScript代码中引用。 示例MXML...

    HtmlTestProject_html_mxml_

    在HTMLTestProject中,MXML可能被用来创建一个可自定义和交互的组件库,这些组件可以在HTML页面中嵌入和使用。MXML组件可以通过ActionScript与HTML元素进行交互,实现数据的双向绑定,从而达到更丰富的用户体验。...

    自定义时间控件

    3. **定义 UI**:在 MXML 文件(如 TimeFile2.mxml)中,我们可以定义控件的外观,包括子组件(例如两个 Spinners 代表小时和分钟)和它们的布局。通过 MXML,我们可以直接在代码中添加皮肤、样式和事件监听器。 4....

    Flex的组件

    每个组件都有一个或多个皮肤,可以通过改变皮肤来实现不同的视觉效果。 2. **States** - 组件可以有多种状态,比如“正常”、“激活”或“禁用”。根据组件的状态,其外观和行为可能会有所不同。 3. **Layouts** -...

    Flex实现带复选框的列表树

    3. 复选框(Checkbox):复选框是用户界面中常见的交互元素,允许用户在多个选项中进行多选。在列表树中,复选框与节点绑定,表示用户对某个节点的选择状态。 4. 数据绑定:在Flex中,数据绑定是一种强大的机制,...

    定制的group

    6. 实践应用:给出一个或多个实际应用案例,演示如何在项目中整合和使用自定义Group。 7. 性能优化:讨论了如何优化自定义Group的性能,例如减少重绘、缓存计算结果等。 8. 开发工具的使用:分享了使用Flex Builder...

    Flex 计算器

    在这个项目中,计算器的每个按钮可能就是一个自定义组件,包含了其自身的视图(MXML)和行为(ActionScript)。这种模块化设计提高了代码的可读性和维护性。 Flex计算器项目不仅展示了MXML和ActionScript的结合使用...

    flex常用自定义控件,带复选框的树和列表等等。

    Flex是Adobe公司开发的一种富互联网应用程序(RIA)框架,它基于ActionScript编程语言和MXML标记语言,主要用于创建交互式的、动态的Web应用。在给定的标题和描述中,我们可以看到开发者分享了一系列在实际项目中...

    flex test

    最后,Flex项目通常包含一个或多个MXML文件,这是Flex的标记语言,可以与ActionScript混合使用,用于声明界面结构和组件。MXML简化了UI设计,让非程序员也能快速构建基本界面。 总的来说,“flex test”可能是一个...

    Flex时间控件

    1. **自定义组件**:ActionScript允许开发者创建自定义UI组件,TimeInput和TimeStepper很可能就是这样的自定义组件。TimeInput可能是一个输入框,用于显示和编辑时间;而TimeStepper可能是带有加减按钮的控件,用户...

    动态可编辑的DataGrid

    `DataGridText.mxml`和`OperateButtons.mxml`可能是两个MXML文件,分别表示DataGrid中用于显示文本的列和操作按钮的用户界面。MXML是一种声明式的标记语言,用于构建Flex组件。`DataGridText.mxml`可能定义了一个...

    Flex2StyleExplorer源码

    它基于ActionScript编程语言和MXML标记语言,允许开发者创建交互式的、数据驱动的Web应用。 2. **MXML**:Flex2StyleExplorer.mxml是主应用程序文件,使用MXML语法编写。MXML是一种声明式语言,结合了XML和...

    完整的Flex中文帮助文档 PDF格式

    2. **MXML和ActionScript**:MXML是Flex的主要标记语言,用于描述UI组件和应用结构,而ActionScript是一种面向对象的脚本语言,用于处理逻辑和交互。MXML和ActionScript的结合使得开发者可以分离界面设计和业务逻辑...

    AppleAccordionExample

    在Web开发中,Accordions是一种常见的用户界面组件,它允许用户在有限的空间内展示和隐藏多个内容区域。这种组件通常用于提高网页的可读性和交互性,让用户能够有选择地查看或隐藏详细信息。 Flex是Adobe开发的一种...

    Flex 做的仿Vista的皮肤

    它使用ActionScript编程语言和MXML标记语言,为开发者提供了创建动态、交互式用户界面的强大工具。在本主题中,"Flex做的仿Vista的皮肤"指的是使用Flex技术来模仿微软Windows Vista操作系统的视觉样式,以提升软件的...

    Flex3.0RIA开发详解电子教程22

    Flex3.0是Adobe公司推出的一种富互联网应用(Rich Internet Application, RIA)开发框架,它基于ActionScript编程语言和MXML标记语言,为开发者提供了创建动态、交互性丰富的Web应用程序的强大工具。本教程“Flex3.0...

    谷歌地图flash插件源码

    1. ActionScript源代码文件(.as):这是实现谷歌地图功能的核心代码,可能包括与地图API的交互逻辑,以及自定义组件的实现。 2. MXML源代码文件(.mxml):定义了Flex界面的布局和组件结构,与地图插件相关的UI元素...

    flex 自动搜索动能

    总的来说,Flex中的自动搜索功能涉及到事件处理、数据过滤、数据绑定、自定义组件等多个方面。通过合理的代码组织和优化,我们可以创建一个高效、用户友好的自动搜索体验。对于`AutoComplete.as`文件,这可能是实现...

    Flex RichTextToolBarDemo 富文本输入工具条

    Flex是一种用于构建富互联网应用程序(RIA)的开源框架,它基于ActionScript编程语言和MXML标记语言,能够创建动态、交互式的用户界面。在Flex中,富文本编辑功能通常由RichText或RichEditableText组件提供,而...

Global site tag (gtag.js) - Google Analytics