【发布时间】:2011-04-19 11:02:34
【问题描述】:
我想要一个足够宽的下拉列表,以容纳主控件显示区域下拉列表中的较大项目。(即具有 MX Combobox 功能的下拉列表) 请指导我。
【问题讨论】:
标签: apache-flex flex4
我想要一个足够宽的下拉列表,以容纳主控件显示区域下拉列表中的较大项目。(即具有 MX Combobox 功能的下拉列表) 请指导我。
【问题讨论】:
标签: apache-flex flex4
这会将下拉菜单的宽度调整为数据的宽度。 我忘记了这个例子是我从哪里得到代码的。我相信高度可以由 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>
【讨论】:
您应该创建自定义 DropDownList(扩展原始)并覆盖 dataProvider setter 和 measure() 方法。在dataProvider setter 中,您应该调用invalidateSize(),并且在测量中您应该迭代您的数据提供者并找到最大的标签(您可以为标签分配新文本并比较它们的宽度)。
【讨论】:
要增加组合框下拉列表的高度,请使用 "rowCount" 属性。这适用于 Flex 3.6.0
【讨论】:
查看 Flex 示例中的 this example。您只需为DropDownList 创建一个皮肤并设置popUpWidthMatchesAnchorWidth="false" 属性。
【讨论】:
通过以下代码实现:
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;
}
}
【讨论】:
抱歉,最好把字段的宽度和高度都去掉。
【讨论】: