2009-08-12 5 views
0

Je crée une fenêtre de chat, un peu comme cet exempleComment puis-je obtenir un conteneur Flex pour faire défiler jusqu'à la dernière position?

http://demo.seanhess.net/oneshots/scrolling.swf

Chaque fois qu'un chat en est ajouté, je le veux montrer complètement le dernier message. J'utilise maxVerticalScrollPosition pour définir la position de défilement sur la liste, mais c'est toujours faux (voir l'exemple). Il sous-estime une rangée ou plus. J'ai essayé ceci avec un récipient régulier et il fait la même chose. Si je fais maxVerticalScrollPosition + 1, ça fonctionne en quelque sorte, mais si le dernier message est particulièrement long, il sera coupé (ne montre que le haut).

Comment puis-je l'obtenir pour faire défiler vers le réelle en bas du conteneur ??

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"> 

    <mx:Script> 
     <![CDATA[ 
      protected function addChat():void 
      { 
       collection.addItem(new String(input.text)); 
       list.verticalScrollPosition = list.maxVerticalScrollPosition; 
       input.text = ""; 
      } 
     ]]> 
    </mx:Script> 

    <mx:Panel width="400" height="290"> 
     <mx:List id="list" width="100%" height="100%" variableRowHeight="true"> 
      <mx:dataProvider> 
       <mx:ArrayCollection id="collection"/> 
      </mx:dataProvider> 
      <mx:itemRenderer> 
       <mx:Component> 
        <mx:Text text="{data}"/> 
       </mx:Component> 
      </mx:itemRenderer> 
     </mx:List> 
     <mx:HBox width="100%"> 
      <mx:TextInput id="input" width="100%" enter="addChat()"/> 
      <mx:Button label="add" click="addChat()"/> 
     </mx:HBox> 
    </mx:Panel> 
</mx:Application> 

Répondre

0

addchat séparée() en deux fonctions, addchat() et addChatScrollToEnd(). Ajoutez l'élément de discussion dans addChat(), puis callLater (addChatScrollToEnd) qui aurait les lignes de défilement.

Vous pouvez également appeler list.validateNow() mais cela n'est pas recommandé pour des raisons de performances.

+0

J'utilise générallement validateNow() sans problèmes de performances dans les applications non triviales. Si elle se déclenche dans une énorme boucle, je l'éviterais, mais dans ce scénario, validateNow() serait recommandé. Je le préfère à callLater() parce que vous avez le contrôle et que vous savez que l'action se déroule maintenant. –

0

Cela devrait fonctionner pour vous.

<mx:Script> 
      <![CDATA[ 
        protected function addChat():void 
        { 
          collection.addItem(new String(input.text)); 
          callLater(function() { 
            list.verticalScrollPosition = list.maxVerticalScrollPosition; 
          }); 
          input.text = ""; 
        } 
      ]]> 
    </mx:Script> 
Questions connexes