1

我有一个使用中继器的 mxml 面板。面板可以水平调整大小,我希望重复的组件与面板一起调整大小。这是一个简单的例子,说明事情的样子:

<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" ...>
    <!-- scripts and some controls -->
    <mx:VBox width="100%">
        <core:Repeater width="100%" dataProvider="model">
            <ns1:MyItemRenderer width="100%" />
        </core:Repeater>
    </mx:VBox>
</mx:TitleWindow>

当我调整组件大小时,重复项的宽度不会改变。

还有按钮和事件处理程序,它们在模型中添加和删除项目。完成后,转发器会更新以显示正确数量的项目,并且所有项目的大小都会正确调整。

调整根面板的大小时,我无法让项目调整大小。我可以看到,中继器周围的 VBOx 正在接收调整大小事件。但是,重复的项目没有得到事件。我试图从连接到 VBox 的调整大小处理程序手动将调整大小事件分派给重复的项目,但这没有帮助。

我还尝试从作为 dataProvider 的 ArrayCollection 添加和删除一个虚拟项目(因为它会触发正确的调整大小,否则如上所述)但是,在 VBox 的调整大小处理程序中执行此操作只会导致转发器不显示任何项目全部。

有什么方法可以让中继器中的项目与它们的封闭容器一起调整大小?

在 mx:List 中使用时,我使用的 ItemRenderer 可以正确调整大小。它是这样构建的,因此当在中继器中使用时,它可以与 List 容器设置的数据属性和 getRepeaterItem() 一起使用。在这种特殊情况下,我不能将 List 用作容器,因为它在通过 rowCount、height 和 maxHeight 属性控制其高度方面的行为方式在这种特殊情况下对我不起作用(我省去了细节)。

4

2 回答 2

0

覆盖 titleWindow 中的 updateDisplayList 并且当高度或宽度发生变化时,使中继器内创建的每个项目上的 displayList 无效。

也就是说,使用中继器通常被认为是不好的做法,因为其中的每个组件都被渲染。基于列表的类——利用渲染器回收被认为性能更高。

根据您的代码段,我无法判断您的代码是否可以在没有中继器的情况下重新工作。

于 2010-06-03T19:26:25.830 回答
0

作为记录,我想出了以下“解决方案”:

在包含转发器的框上使用 maxHeight 属性,将其绑定到从其他组件派生正确值的表达式...我仍然需要硬编码我想为包含转发器的框之后的组件保留的任何空间如果我不想让它们被推出封闭面板,但现在已经足够了。

本质上:

<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" ...>
    <!-- scripts and some controls -->
    <mx:VBox id="outerBox" height="100%">
        <mx:VBox id="innerBox" width="100%"
                 maxHeight="{outerBox.height - innerBox.y - 40}"> 
                 <!-- reserve 40 px for the button -->
            <core:Repeater width="100%" dataProvider="model">
                <ns1:MyItemRenderer width="100%" />
            </core:Repeater>
        </mx:VBox>
        <mx:Button label="Stay Visible"/>
    </mx:VBox>
</mx:TitleWindow>
于 2010-06-09T11:37:48.157 回答