【问题标题】:changin the default width and height of the dropdownlist更改下拉列表的默认宽度和高度
【发布时间】:2011-04-19 11:02:34
【问题描述】:

我想要一个足够宽的下拉列表,以容纳主控件显示区域下拉列表中的较大项目。(即具有 MX Combobox 功能的下拉列表) 请指导我。

【问题讨论】:

    标签: apache-flex flex4


    【解决方案1】:

    这会将下拉菜单的宽度调整为数据的宽度。 我忘记了这个例子是我从哪里得到代码的。我相信高度可以由 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>
    

    【讨论】:

    • 在 flex 3 中,如果我们不指定组合框的宽度和高度,那么组合框的宽度足以容纳下拉列表中较大的元素。现在我们在 flex 4 中有单独的下拉列表控件。如果我们没有指定下拉列表的宽度和高度,那么它将需要 112 像素作为宽度(默认宽度)。我的要求是,如果我不指定下拉列表的宽度和高度,它应该足够宽以容纳其弹出窗口中较大的内容。请就此向我提出建议
    • 这正是我在答案中发布的类文件的作用。您甚至尝试过使用它们吗?
    【解决方案2】:

    您应该创建自定义 DropDownList(扩展原始)并覆盖 dataProvider setter 和 measure() 方法。在dataProvider setter 中,您应该调用invalidateSize(),并且在测量中您应该迭代您的数据提供者并找到最大的标签(您可以为标签分配新文本并比较它们的宽度)。

    【讨论】:

    • 我也有同样的想法,但我的老板告诉我要找到其他属性来实现这个行为。所以请指导我
    • 似乎没有办法调整现有属性来实现它。对不起。
    • 呵呵。您可以投票甚至接受重新计算的答案:)您的问题有非常有用的答案:)
    【解决方案3】:

    要增加组合框下拉列表的高度,请使用 "rowCount" 属性。这适用于 Flex 3.6.0

    【讨论】:

      【解决方案4】:

      查看 Flex 示例中的 this example。您只需为DropDownList 创建一个皮肤并设置popUpWidthMatchesAnchorWidth="false" 属性。

      【讨论】:

      • 是的,我已经尝试过给定的概念。但是在 flex 3 中,如果我们不指定组合框的宽度和高度,那么组合框的宽度足以容纳下拉列表中较大的元素.现在我们在 flex 4 中有单独的下拉列表控件。如果我们没有指定下拉列表的宽度和高度,那么它将需要 112 像素作为宽度(默认宽度)。我的要求是,如果我不指定下拉列表的宽度和高度,它应该足够宽以容纳其弹出窗口中较大的内容。请就这个要求向我提出建议。
      【解决方案5】:

      通过以下代码实现:

      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;
              }
      
      
      
          }
      

      【讨论】:

        【解决方案6】:

        抱歉,最好把字段的宽度和高度都去掉。

        【讨论】:

        • 如果我们同时删除高度和宽度,那么默认的高度和宽度属性将应用于下拉列表
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-29
        • 2012-12-05
        • 2011-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-19
        相关资源
        最近更新 更多