我有一个VBox,它以编程方式动态添加和删除子项。高度设置为100%,verticalScrollPolicy = auto。
当用户想要将另一个孩子添加到该Vbox时,我希望它自动滚动到VBox的底部,因为这是添加孩子的地方。
我已经尝试了我可以在网上找到的所有解决方案,但无论如何,verticalScrollPosition和maxVerticalScrollPosition都始终等于0.即使我手动滚动到VBox的底部并按下提醒这些数字的按钮。 (即使在'validateNow()'之后)。
我唯一可以让这些数字改为programmaticaly的是VBox高度设置为像素,这是我不想要的,因为孩子都有不同的高度。
Plllease告诉我,可以设置verticalScrollPosition而不用硬编码高度(以像素为单位)?我错过了一些完全明显的东西吗?
答案 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的高度被绑定到其包含组件的高度(这里只是应用程序)。其他一切都应该是不言自明的。
希望有所帮助!如果您有任何问题,请回复。