2009-07-10 2 views
1

Explility explizit festgelegt ist Ich habe eine VBox, die Kinder programmatisch hinzufügt und automatisch entfernt. Die Höhe ist auf 100% und verticalScrollPolicy = auto eingestellt.AutoScrolling einer VBox ist nur möglich, wenn Höhe in Flex 3

Wenn ein Benutzer dieser Vbox ein weiteres Kind hinzufügen möchte, möchte ich, dass es automatisch an den unteren Rand der VBox gescrollt wird, da dort das Kind hinzugefügt wird.

Ich habe jede Lösung ausprobiert, die ich online finden konnte, aber egal, die vertikaleScrollPosition und maxVerticalScrollPosition sind beide immer gleich 0. Auch wenn ich manuell bis zum Ende der VBox scrollen und einen Knopf drücken, der diese Nummern alarmiert (Auch nach 'validateNow()').

Das einzige Mal, dass ich diese Zahlen programmatisch ändern kann, ist, wenn die VBox Höhe in Pixel eingestellt ist, was ich nicht will, da die Kinder alle unterschiedliche Höhen haben.

Bitte sagen Sie mir, dass es möglich ist, verticalScrollPosition ohne harte Codierung der Höhe in Pixeln zu setzen? Fehle ich etwas völlig Offensichtliches hier?

Antwort

2

Sie scrollen möglicherweise nicht die VBox, tatsächlich; Es besteht eine gute Chance, dass wenn Ihre VBox in einem anderen Container, wie einem Canvas oder ähnlichem, enthalten ist und Sie der VBox Objekte hinzufügen, wie Sie sagen, ist es der Canvas, der scrollt, nicht die VBox - in In diesem Fall würde die VBox tatsächlich 0 für ihre Bildlaufposition zurückgeben.

So oder so, Sie haben Recht - Sie müssen die Höhe der Komponente einstellen; selbst Constraint-Layout-Einstellungen (z. B. "bottom = '10 '" usw.) funktionieren nicht. Wenn es Ihnen jedoch gelingt, die Höhe der VBox festzulegen, indem Sie ihre Dimensionen irgendwie an ein anderes Steuerelement binden oder indem Sie sie explizit als Teil des Prozesses zum Anhängen/Erstellen eines Kindes festlegen, sollten Sie in der Lage sein, das zu erreichen, was Sie wollen.

Hier ist ein Beispiel für eine AIR-App, die ich zur Veranschaulichung des Beispiels dargestellt habe. Im Grunde fügt es einfach eine Box mit zufälliger Größe zu einer VBox hinzu und scrollt zum unteren Ende der VBox, nachdem jedes Kind erstellt wurde.

<?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> 

In diesem Fall wird die Höhe des VBox auf die Höhe seiner enthaltenden Komponente (hier nur die Anwendung) gebunden zu sein. Alles andere sollte ziemlich selbsterklärend sein.

Hoffe, dass hilft! Posten Sie zurück, wenn Sie irgendwelche Fragen haben.

+0

Sie hatten Recht, es war eine wachsende VBox in einem scrollenden Canvas. Die Leinwand musste stattdessen gescrollt werden. Vielen Dank. – markmarkoh

+0

Ich hatte mehrere Ebenen der Steuerung verschachtelt und endete mit 'height =" {this.height} "' wenn 'height =" {parentID.height} "' nicht funktionierte (Ich hatte eine Bildlaufleiste, aber die VBox war wie 20 Pixel groß) –