Невозможно автоматически прокрутить VBox, если в Flex 3 явно не задана высота (в пикселях)

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

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

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

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

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


person markmarkoh    schedule 10.07.2009    source источник


Ответы (1)


На самом деле, возможно, вы не прокручиваете VBox; есть большая вероятность, что если ваш VBox содержится в другом контейнере, таком как Canvas или тому подобное, и вы добавляете элементы в VBox, как вы говорите, прокрутка выполняется Canvas, а не VBox - в в этом случае VBox действительно вернет 0 для своей позиции прокрутки.

Так или иначе, вы правы - нужно задать высоту компонента; даже настройки компоновки ограничений (например, «bottom = '10 'и т. д.) не будут работать. Но если вам удастся установить высоту VBox, либо привязав его размеры как-то к другому элементу управления, либо явно установив их как часть процесса добавления / создания дочернего элемента, вы сможете выполнить то, что вам нужно.

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

Надеюсь, это поможет! Отправьте ответ, если у вас есть вопросы.

person Christian Nunciato    schedule 10.07.2009
comment
Вы были правы, это был растущий VBox внутри прокручиваемого холста. Вместо этого пришлось прокручивать холст. Спасибо. - person markmarkoh; 13.07.2009
comment
У меня было несколько вложенных уровней управления, и в итоге я делал height="{this.height}", когда height="{parentID.height}" не работал (у меня была полоса прокрутки, но VBox был примерно 20 пикселей в высоту) - person Adam Nofsinger; 01.07.2011