Изменить ширину и высоту выпадающего списка по умолчанию
Я хочу выпадающий список, который достаточно широк, чтобы вместить более крупный элемент в раскрывающемся списке в области отображения основного элемента управления (т.е. выпадающий список с функциональностью MX Combobox), пожалуйста, помогите мне в этом.
6 ответов
Вы должны создать собственный DropDownList (расширяющий оригинал) и переопределить dataProvider
сеттер и measure()
метод. В dataProvider
сеттер вы должны вызвать invalidateSize()
и в меру вы должны выполнить итерацию своего поставщика данных и найти самую большую метку (вы можете назначить новый текст метке и сравнить их ширину).
Это позволит настроить ширину раскрывающегося списка в соответствии с шириной данных. Я забыл, где пример, откуда я взял код. Высота может быть установлена 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>
Чтобы увеличить высоту раскрывающегося списка поля со списком, используйте свойство "rowCount". Это для Flex 3.6.0
Посмотрите этот пример из Flex Примеры. Вам просто нужно создать скин для 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;
}
}