Кто-нибудь знает пример многостолбцового VBox? - PullRequest
1 голос
/ 01 февраля 2010

Просто интересно, знает ли кто-нибудь какой-нибудь пример или класс, который я могу добавить в свое приложение, которое будет работать как VBox, но с двумя или более столбцами?

Я добавляю элементы в VBox из цикла, и это прекрасно работает, но я хочу разделить его на два столбца:

 _________________
|        |        |
| Item 1 | Item 2 |
| Item 3 | Item 4 |
| Item 5 |        |
|________|________|

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

EDIT
Пожалуйста, перестаньте давать мне обходные пути. У меня уже есть функциональное решение. Но если вы уже написали класс, который делает это, или знаете, где я могу найти один онлайн, я был бы очень признателен. Спасибо

Ответы [ 7 ]

1 голос
/ 16 февраля 2010

flexlib (http://code.google.com/p/flexlib/) имеет прекрасный контейнерный элемент управления FlowContainer, который будет делать именно то, что вам нужно.

0 голосов
/ 24 июня 2010

Я думаю, что контейнер для плитки с направлением = "горизонтальный" сделает это

0 голосов
/ 03 февраля 2010

У меня была похожая проблема. Вот что я использовал в итоге:

package {
    import mx.containers.HBox;
    import mx.containers.VBox;
    import mx.events.FlexEvent;

    public class MultiColumnVBox extends HBox {
        // public properties
        public var columnWidth:int;
        public var verticalGap:int;
        public var adjustForScrollbar:Boolean;

        public function MultiColumnVBox() {
            super();
            this.addEventListener(FlexEvent.CREATION_COMPLETE, rearrangeChildren);
        }

        private function rearrangeChildren(evtObj:FlexEvent):void {
            // height will change whilst rearranging children, as will the Children Array
            // we store them once at the start
            var myHeight:int = this.height;
            var children:Array = this.getChildren();

            var lastIndex:int = 0;
            var vBoxIndex:int = 0;
            var vBox:VBox;
            var totalHeight:int = -this.verticalGap + (this.adjustForScrollbar ? 16 : 0);

            for(var i:int=0; i<children.length; i++) {
                // resize each child and measure the height
                // if you don't want it resized to the columnWidth, set the maxWidth property
                children[i].width = this.columnWidth;
                children[i].validateSize();
                totalHeight += children[i].measuredHeight + this.verticalGap;
                // if we're too tall, or we've reached the last element, move them into a VBox
                if(totalHeight > myHeight || i == children.length-1) {
                    vBox = new VBox();
                    vBox.setStyle("verticalGap", this.verticalGap);
                    vBox.width = this.columnWidth;
                    // include last child if there is room
                    for(var j:int=lastIndex; j<(totalHeight > myHeight ? i : i+1); j++) {
                        vBox.addChild(children[j]);
                    }
                    this.addChildAt(vBox, vBoxIndex);
                    vBoxIndex += 1;
                    lastIndex = i;
                    totalHeight = -this.verticalGap + (this.adjustForScrollbar ? 16 : 0);
                }
            }
        }
    }
}

Однако конечный результат немного отличается. Вместо перемещения дочерних элементов в чередующиеся столбцы он заполняет высоту первого столбца, затем второго, затем третьего и т. Д. До бесконечности.

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

0 голосов
/ 01 февраля 2010

Почему бы просто не использовать Tile Container и установить для свойства direction нужное направление потока?

0 голосов
/ 01 февраля 2010

Я сделал что-то похожее с HBox и 2 формами, которые хорошо выстраиваются. Динамически вы можете поочередно добавлять детей в каждую форму.

0 голосов
/ 01 февраля 2010

Вы можете использовать VBox, содержащий HBox для каждой строки, и просто заполнить каждый HBox 2 элементами, например:

var vb: VBox;
var array_of_items: Array;

для (var i: int = 0; i {
var hb: Hbox = new HBox ();
hb.addChild (array_of_items [I]);
hb.addChild (array_of_items [г + 1]);
vb.addChild (HB);
}

0 голосов
/ 01 февраля 2010

положить их в ящик?

...