2

我在 Flex 4 中有这样的代码

<!-- START >>> middle part: items -->
<mx:Canvas id="itemContainer"
           width="100%"
           height="100%">
    <!-- START >>> Items Display on the page -->
    <mx:Repeater id="richTextReapeater" 
                 dataProvider="{_model.current_day.richTextNotes}">
        <components:RichTextNoteDisplay theNote="{richTextReapeater.currentItem}" />    
    </mx:Repeater>
    <mx:Repeater id="postItReapeater" 
                 dataProvider="{_model.current_day.positNotes}">
            <components:PostItNoteDisplay theNote="{postItReapeater.currentItem}"  />   
    </mx:Repeater>
    ......
</mx:Canvas>

主要是一个 MX:Canvas,里面有我创建的多个自定义组件的中继器。这些自定义组件大部分是这样的:

   <s:SkinnableContainer xmlns:fx="http://ns.adobe.com/mxml/2009"
                          xmlns:s="library://ns.adobe.com/flex/spark"
                          xmlns:mx="library://ns.adobe.com/flex/mx"
                          x="{theNote.x}"
                          y="{theNote.y}"
                          width="{theNote.width}"
                          height="{theNote.height}"
                          depth="{theNote.depth}"
                          rotation="{theNote.rotation}"
creationComplete="skinnablecontainer1_creationCompleteHandler(event)" >

除深度外,一切正常(x,y,宽度,高度,旋转)!

似乎无论数字是多少,它都显示为它在父容器中呈现的顺序。(MX:帆布)!

我想要实现的是相对于彼此, mx:Canvas 中的所有项目都按照分配给它们的“深度”顺序显示。

我该怎么做呢?

4

1 回答 1

1

您正在使用中继器;这本质上是一个循环。

听起来您要求循环遍历项目,但以不同的顺序处理这些项目。那是对的吗?

我的第一个建议是您研究在中继器“运行”之前按深度对 dataProvider 项目进行排序的方法。

我的第二个建议是不要使用中继器。由于渲染器回收,基于列表的类将为您提供更好的性能。

如果您确实需要一次创建所有子项,我的第三个建议是您转而使用 ActionScript 实现,这将使您能够更精细地控制事物的创建方式和时间。

每次我使用中继器时,我都很不开心。


以下是有关Flex 4的列表和 itemRenderers的一些信息。

这是对我如何修改此示例以使用列表而不是中继器的粗略估计:

    <!-- START >>> middle part: items -->
    <mx:Canvas id="itemContainer"
               width="100%"
               height="100%">
        <!-- START >>> Items Display on the page -->
        <s:List id="richTextList" 
                     dataProvider="{_model.current_day.richTextNotes}"
                     itemRenderer="com.something.myComponent">
        </s:List>
    </mx:Canvas>

itemRenderer 可能是这样的:

<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    xmlns:s="library://ns.adobe.com/flex/spark">
    <s:SkinnableContainer rotation="{data.rotation}"
    creationComplete="skinnablecontainer1_creationCompleteHandler(event)" />
</s:ItemRenderer>

该列表将确定渲染器的宽度、x 和 y 位置。在大多数情况下,它还会确定高度;尽管 Flex 3 List 有一个variableRowHeight选项。

如果您想使用基于数据的不同渲染器,请考虑使用itemRendererFunction

于 2010-07-17T21:23:58.247 回答