Невозможно автоматически прокрутить VBox, если в Flex 3 не задана высота (в пикселях) - PullRequest
1 голос
/ 10 июля 2009

У меня есть VBox, который динамически добавляет и удаляет детей программно. Высота установлена ​​на 100%, а verticalScrollPolicy = auto.

Когда пользователь хочет добавить другого дочернего элемента в этот Vbox, я хочу, чтобы он автоматически прокрутился до нижней части VBox, поскольку именно там добавляется дочерний элемент.

Я испробовал каждое решение, которое смог найти в Интернете, но, несмотря ни на что, verticalScrollPosition и maxVerticalScrollPosition ВСЕГДА равны 0. Даже если я прокручиваю вручную до нижней части VBox и нажимаю кнопку, которая сообщает эти цифры. (Даже после 'validateNow ()').

Единственный раз, когда я могу заставить эти числа изменять программно, это когда высота VBox задается в пикселях, чего я не хочу, так как все дети имеют разную высоту.

Скажите, пожалуйста, что можно установить verticalScrollPosition без жесткого кодирования высоты в пикселях? Я что-то упускаю здесь совершенно очевидно?

1 Ответ

2 голосов
/ 11 июля 2009

Возможно, вы не прокручиваете VBox; есть большая вероятность, что если ваш VBox содержится в другом контейнере, например, Canvas и т. п., и вы добавляете элементы в VBox в том виде, в каком вы говорите, это прокрутка, а не 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 привязана к высоте его содержащего компонента (здесь только приложение). Все остальное должно быть довольно понятным.

Надеюсь, это поможет! Пишите обратно, если у вас есть какие-либо вопросы.

...