1

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

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

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

我唯一能以编程方式更改这些数字的时间是当 VBox 高度以像素为单位设置时,这是我不想要的,因为孩子们都有不同的高度。

请告诉我,可以在不硬编码像素高度的情况下设置verticalScrollPosition吗?我在这里错过了一些完全明显的东西吗?

4

1 回答 1

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 的高度被绑定到它的包含组件的高度(这里,只是应用程序)。其他一切都应该是不言自明的。

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

于 2009-07-10T22:53:07.750 回答