转发器内的组件未按预期调整大小

时间:2010-06-03 16:20:36

标签: flex repeater resizable

我有一个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正在调整大小。但是,重复的项目没有得到事件。我试图从一个调整大小的处理程序手动向重复的项目发送一个resize事件,我连接到VBox但是没有帮助。

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

有没有办法让转发器中的物品用封闭的容器调整大小?

我正在使用的ItemRenderer在mx:List中使用时正确调整大小。它的构建使得它可以在List容器中设置的数据属性和在Repeater中使用时使用getRepeaterItem()。在这种特殊情况下,我不能将List用作容器,因为它通过rowCount,height和maxHeight属性控制其高度的行为方式在这种特殊情况下对我来说不起作用(我饶了你详情)。

2 个答案:

答案 0 :(得分:0)

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

也就是说,使用中继器通常被认为是不好的做法,因为它内部的每个组件都被渲染。基于列表的类 - 使用渲染器重新编号被认为是更高效的。

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

答案 1 :(得分: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>