2009-08-12 58 views
0

我創建一個聊天窗口,就像這個例子如何讓Flex容器滾動到最後位置?

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

每當新增聊天時,我希望它完全顯示的最後一條消息。我使用maxVerticalScrollPosition設置列表上的滾動位置,但始終是錯誤的(請參閱示例)。它連續排列在下面。我已經用普通的容器試過了,它也做了同樣的事情。如果我做maxVerticalScrollPosition + 1,它有點作用,但如果最後一條消息特別長,它會被截斷(只顯示頂部)。

我怎樣才能得到它滾動到實際容器的底部?

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

回答

0

將addChat()分爲addChat()和addChatScrollToEnd()兩個函數。在addChat()中添加聊天項目,然後調用具有滾動行的callLater(addChatScrollToEnd)。

或者,您可以調用list.validateNow(),但不建議出於性能原因。

+0

我自由地使用validateNow()而不是在非平凡的應用程序中的性能問題。如果它在一個巨大的循環中發射,比我想避免它,但在這種情況下,建議使用validateNow()。我更喜歡它通過callLater(),因爲你在控制,並知道現在正在發生的行動。 – 2009-08-12 18:59:40

0

這應該適合你。

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