2011-04-19 78 views

回答

2

您應該創建自定義的DropDownList(延長原),並覆蓋dataProvider setter和measure()方法。在dataProvider setter中,您應該調用invalidateSize(),並且應該重複您的數據提供程序並查找最大標籤(您可以將新文本分配給標籤並比較它們的寬度)。

+0

我也同樣認爲,但我的老闆告訴我找到其他任何財產來實現這個bahaviour.so請引導我關於這個 – vengatesh 2011-04-20 09:08:28

+1

似乎沒有辦法調整現有的屬性來實現它。抱歉。 – Constantiner 2011-04-20 09:13:16

+0

噢,非常感謝您幫助我解決這個問題。 – vengatesh 2011-04-20 10:30:08

1

從Flex示例檢出this example。您只需爲DropDownList創建一個外觀並設置popUpWidthMatchesAnchorWidth="false"屬性。

+0

是的我已經嘗試了給定的概念。但在flex 3中,如果我們沒有指定組合框的寬度和高度,那麼組合框的寬度足夠寬以容納較大的元素在下拉列表中。現在我們在flex 4中有單獨的下拉列表控件。如果我們沒有指定寬度和高度作爲下拉列表,那麼它將佔用112像素寬度(默認寬度)。我的要求是,如果我沒有指定下拉列表的寬度和高度,它應該足夠寬以容納其彈出窗口中較大的內容。請在這個要求上給我建議。 – vengatesh 2011-04-20 05:48:37

3

這將調整下拉寬度到數據寬度。 我忘記了哪裏的例子是我從哪裏得到的代碼。我相信rowCount可以設置高度。

package valueObjects.comboBox{ 

    import flash.events.Event; 
    import mx.controls.ComboBox; 
    import mx.core.ClassFactory; 
    import mx.core.IFactory; 
    import mx.events.FlexEvent; 

    public class ExtendedComboBox extends ComboBox{ 
     private var _ddFactory:IFactory = new ClassFactory(ExtendedList); 

     public function ExtendedComboBox(){  
      super(); 
     } 
     override public function get dropdownFactory():IFactory{ 
      return _ddFactory; 
     } 
     override public function set dropdownFactory(factory:IFactory):void{ 
      _ddFactory = factory; 
     } 
     public function adjustDropDownWidth(event:Event=null):void{  

     this.removeEventListener(FlexEvent.VALUE_COMMIT,adjustDropDownWidth); 
      if (this.dropdown == null){ 
       callLater(adjustDropDownWidth); 
      }else{ 
       var ddWidth:int = this.dropdown.measureWidthOfItems(-1,this.dataProvider.length); 
       if (this.dropdown.maxVerticalScrollPosition > 0){      
        ddWidth += ExtendedList(dropdown).getScrollbarWidth();      
       }     
       this.dropdownWidth = Math.max(ddWidth,this.width);     
      } 
     } 
     override protected function collectionChangeHandler(event:Event):void{ 
      super.collectionChangeHandler(event); 
      this.addEventListener(FlexEvent.VALUE_COMMIT,adjustDropDownWidth);   
     } 
    } 
} 



package valueObjects.comboBox{ 
    import mx.controls.List; 

    public class ExtendedList extends List{ 
     public function ExtendedList(){ 
      super(); 
     } 
     public function getScrollbarWidth():int{ 
      var scrollbarWidth:int = 0; 
      if (this.verticalScrollBar != null){ 
       scrollbarWidth = this.verticalScrollBar.width; 
      } 
      return scrollbarWidth; 
     } 

    } 
} 




<?xml version="1.0" encoding="utf-8"?> 
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" mlns:comboBox="valueObjects.comboBox.*" > 

    <comboBox:ExtendedComboBox labelField="data.totext()" itemRenderer="mx.controls.Label" /> 
</mx:Canvas> 
+0

Flex 3中,如果我們不指定組合框的寬度和高度,則組合框的寬度足夠寬,以容納在下拉列表較大元件。現在我們在flex 4中有單獨的下拉列表控件。如果我們沒有指定寬度和高度作爲下拉列表,那麼它將佔用112像素寬度(默認寬度)。我的要求是,如果我沒有指定下拉列表的寬度和高度,它應該足夠寬以容納其彈出窗口中較大的內容。請在此建議我 – vengatesh 2011-04-20 05:49:17

+0

這正是我在答案中發佈的類文件所做的。你甚至嘗試過使用它們嗎? – 2011-04-20 17:19:28

1

它是通過下面的代碼來實現的:

public override function set dataProvider(value:IList):void 
    { 

     var length:Number = 0; 
     var array:Array = value.toArray(); 
     super.dataProvider = value; 
     var labelName:String = this.labelField; 
     var typicalObject:Object =new Object(); 
     for each(var obj:Object in array) 
     { 
      var temp:Number = obj[labelName] .length; 
      if(length < temp) 
      { 

       length = temp; 
       Alert.show(" length "+length.toString()); 
       typicalObject = obj; 
      } 
      //length = length < Number(obj[labelName].length) ? Number(obj[labelName].length) : length 
      //Alert.show(obj[labelName].length); 
      this.typicalItem = typicalObject; 
     } 



    } 
0

對不起,更好起飛從字段的寬度和高度二者。

+0

抱歉,夥計,它不工作 – vengatesh 2011-04-20 11:50:27

+0

如果我們刪除高度和寬度,然後默認的高度和寬度屬性應用下拉列表 – vengatesh 2011-04-20 13:05:30

2

要增加組合框下拉列表的高度,請使用「rowCount」屬性。這是用於Flex 3.6.0