除非在Flex 3中明确设置了高度(以像素为单位),否则无法自动滚动VBox

时间:2009-07-10 18:06:01

标签: flex flash flex3 containers

我有一个VBox,它以编程方式动态添加和删除子项。高度设置为100%,verticalScrollPolicy = auto。

当用户想要将另一个孩子添加到该Vbox时,我希望它自动滚动到VBox的底部,因为这是添加孩子的地方。

我已经尝试了我可以在网上找到的所有解决方案,但无论如何,verticalScrollPosition和maxVerticalScrollPosition都始终等于0.即使我手动滚动到VBox的底部并按下提醒这些数字的按钮。 (即使在'validateNow()'之后)。

我唯一可以让这些数字改为programmaticaly的是VBox高度设置为像素,这是我不想要的,因为孩子都有不同的高度。

Plllease告诉我,可以设置verticalScrollPosition而不用硬编码高度(以像素为单位)?我错过了一些完全明显的东西吗?

1 个答案:

答案 0 :(得分:2)

实际上你可能不会滚动VBox;如果你的VBox包含在另一个容器中,比如Canvas之类,并且你正在按照你的说法向VBox添加项目,那么很有可能是正在进行滚动的Canvas,而不是VBox。在这种情况下,VBox确实会为其滚动位置返回0。

不管怎样,你是对的 - 你必须设置组件的高度;甚至约束布局设置(例如,“bottom = '10'”等)将不起作用。但是,如果您可以设法设置VBox的高度,或者通过将其维度以某种方式绑定到另一个控件,或者通过将它们显式设置为子项的追加/创建过程的一部分,您应该能够完成您所追求的目标。

这是我用来模拟示例的AIR应用程序的示例。基本上它只是将随机大小的框添加到VBox中,并在每个子项创建后滚动到VBox的底部。

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" verticalScrollPolicy="off" horizontalScrollPolicy="off" width="250">

    <mx:Script>
        <![CDATA[

            import mx.core.Application;
            import mx.containers.Box;
            import mx.events.FlexEvent;

            private function addItem(h:Number):void
            {
                var b:Box = new Box();
                b.width = 200;
                b.setStyle("backgroundColor", 0xFFFFFF);
                b.height = h;

                // Wait for the component to complete its creation, so you can measure and scroll accordingly later
                b.addEventListener(FlexEvent.CREATION_COMPLETE, b_creationComplete);
                vb.addChild(b);
            }

            private function b_creationComplete(event:FlexEvent):void
            {
                event.currentTarget.removeEventListener(FlexEvent.CREATION_COMPLETE, b_creationComplete);
                vb.verticalScrollPosition = vb.getChildAt(vb.numChildren - 1).y;
            }

        ]]>
    </mx:Script>

    <mx:VBox id="vb" top="10" right="10" left="10" height="{Application.application.height - 80}" verticalScrollPolicy="on" />
    <mx:Button label="Add Item" click="addItem(Math.random() * 100)" bottom="10" left="10" />

</mx:WindowedApplication>

在这种情况下,VBox的高度被绑定到其包含组件的高度(这里只是应用程序)。其他一切都应该是不言自明的。

希望有所帮助!如果您有任何问题,请回复。