2009-07-10 3 views
1

J'ai une VBox qui ajoute et supprime dynamiquement des enfants par programme. La hauteur est définie sur 100% et verticalScrollPolicy = auto.Impossible d'auto-défiler une VBox sauf si la hauteur est explicite définie (en pixels) dans Flex 3

Lorsqu'un utilisateur souhaite ajouter un autre enfant à cette Vbox, je veux qu'il défile automatiquement vers le bas de la VBox puisque c'est là que l'enfant est ajouté. J'ai essayé toutes les solutions que je pouvais trouver en ligne, mais quoi qu'il en soit, verticalScrollPosition et maxVerticalScrollPosition sont tous deux TOUJOURS égaux à 0. Même si je défile manuellement en bas de la VBox et que j'appuie sur un bouton qui alerte ces chiffres (Même après 'validateNow()' aussi).

Le seul moment où je peux obtenir ces numéros pour changer de programme est lorsque la hauteur de la VBox est définie en pixels, ce que je ne veux pas puisque les enfants ont tous des hauteurs variables. Pensez-moi qu'il est possible de définir verticalScrollPosition sans coder en dur la hauteur en pixels? Est-ce que je manque quelque chose de totalement évident ici?

Répondre

2

Vous ne faites peut-être pas défiler la VBox; il y a de fortes chances que si votre VBox est contenue par un autre conteneur, comme un Canvas ou similaire, et que vous ajoutez des éléments à la VBox comme vous le dites, c'est le Canvas qui fait défiler, pas le VBox - dans Dans ce cas, la VBox retournerait 0 pour sa position de défilement. D'une manière ou d'une autre, vous avez raison - vous devez régler la hauteur du composant; même les paramètres de mise en page de contrainte (par exemple, "bottom = '10" ", etc.) ne fonctionneront pas. Mais si vous parvenez à définir la hauteur de la VBox, soit en liant ses dimensions à un autre contrôle, soit en les définissant explicitement dans le processus d'ajout/création d'un enfant, vous devriez être capable d'accomplir ce que vous recherchez.

Voici un exemple d'application AIR que j'ai simulé pour illustrer l'exemple. Fondamentalement, il ajoute simplement des boîtes de taille aléatoire à une VBox, et défile vers le bas de la VBox après que chaque enfant est créé.

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

Dans ce cas, la hauteur du VBox est étant lié à la hauteur de son composant contenant (ici, juste l'application). Tout le reste devrait être assez explicite.

Espérons que ça aide! Post retour si vous avez des questions.

+0

Vous aviez raison, c'était une VBox grandissante à l'intérieur d'une toile défilante. La toile devait être défilée à la place. Merci. – markmarkoh

+0

J'ai eu plusieurs couches de contrôle imbriquées, et j'ai fini par faire 'height =" {this.height} "' quand 'height =" {parentID.height} "' n'a pas fonctionné (j'ai une barre de défilement, mais la VBox était comme 20 pixels de haut) –

Questions connexes