سؤال

فقط أتساءل عما إذا كان أي شخص يعرف مثالاً هناك ، أو فئة يمكنني إضافتها إلى تطبيقي من شأنه أن يؤدي مثل Vbox ولكن مع اثنين أو أكثر من عمودين؟

أقوم بإضافة عناصر إلى Vbox من حلقة ، وهذا يعمل بشكل جيد ، لكنني أريد تقسيمها إلى عمودين:

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

في الوقت الحالي ، سأقوم فقط بتعيين 2 Vboxes جنبًا إلى جنب وأعين عناصر غريبة لأحدها ، وحتى للآخر ، ولكن سيكون من الجيد أن يكون لديك عنصر تحكم يقوم بذلك تلقائيًا.

تعديل
من فضلك توقف عن إعطائي العمل حولها. لدي بالفعل عمل وظيفي. ولكن إذا كنت قد كتبت بالفعل فصلًا يقوم بذلك ، أو تعرف أين يمكنني العثور على واحد عبر الإنترنت ، فسأقدر ذلك حقًا. شكرًا

هل كانت مفيدة؟

المحلول

flexlib (http://code.google.com/p/flexlib/) لديه التحكم في حاوية تدفق جميل من شأنه أن يفعل بالضبط ما تحتاجه.

نصائح أخرى

ضعهم في Hox؟

يمكنك استخدام Vbox يحتوي على Hbox لكل صف وببساطة ملء كل hbox مع عنصرين ، شيء مثل:

var vb: vbox ؛
var array_of_items: Array ؛

لـ (var i: int = 0 ؛ i <array_of_items.length ؛ i+= 2)
{
var hb: hbox = new hbox () ؛
hb.addchild (array_of_items [i]) ؛
hb.addchild (array_of_items [i+1]) ؛
VB.Addchild (HB) ؛
}

لقد فعلت شيئًا مشابهًا لهذا مع Hox و 2 نماذج ، مما يصطف الأمور بشكل جيد. ديناميكيا ، يمكنك بالتناوب إضافة الأطفال إلى كل نموذج.

لماذا لا تستخدم فقط حاوية البلاط ، وتعيين خاصية الاتجاه على اتجاه التدفق المطلوب؟

واجهت مشكلة مماثلة بنفسي. هذا ما انتهى بي الأمر باستخدام:

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.

أعتقد أن حاوية البلاط مع اتجاه = "أفقي" سيفعل ذلك

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top