2010-01-13 7 views
0

Я работаю над приложением (с ComboBoxes), которое требует масштабирования всего приложения на основе разрешения экрана. Я думал, что это просто требует изменения «Scalex» и «ScaleY» свойства приложения верхнего уровня, но обнаружил, что ComboBox Выпадающий не отображается в масштабе, соответственно, как показано в следующем примере:Сброс выпадающего списка ComboBox не соответствует DisplayList

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" 
    applicationComplete="init()"> 
    <mx:Script> 
     <![CDATA[ 
     import mx.collections.ArrayCollection; 
     private var options:ArrayCollection = new ArrayCollection([1,2,3,4]); 

     public function init():void { 
      this.scaleX = 5; 
      this.scaleY = 5; 
     } 
     ]]> 
    </mx:Script> 

    <mx:ComboBox id="box" dataProvider="{this.options}"/> 
</mx:Application> 

лучшее, что я был в состоянии сделать с его добавлением «MouseEvent.MOUSE_DOWN» слушателя на ComboBox и обращение с ним, как так:

var comboBox:ComboBox = event.currentTarget as ComboBox; 
comboBox.dropdown.scaleX = 5; comboBox.dropdown.scaleY = 5; 

который приводит в раскрывающемся меню появляется (сползания) не масштабируется до тех пор, пока не достигнет увеличенной длины gth и останавливается, и в этот момент он масштабируется и остается в этом масштабе до тех пор, пока он не будет закрыт. Я также обнаружил, что если вы вызываете «invalidateDisplayList()» в comboBox или выпадающем списке, то это отменяет масштабирование, поэтому кажется, что всякий раз, когда вызывается updateDisplayList, выпадающее приложение применяет только его родительское масштабирование ComboBox, а не родительский компонент ComboBox масштабирование контейнера.

Я понимаю, что в качестве всплывающего окна выпадающее меню отсутствует в дереве displayList приложения или ComboBox, который, как представляется, является корнем проблемы (каламбур не предназначен).

У кого-нибудь есть идеи, как решить эту проблему?

Заранее благодарен!

ответ

1

Одним из вариантов является использование завод, чтобы сгенерировать выпадающий список, что-то вроде:

<mx:ComboBox id="box" dataProvider="{this.options}"> 
     <mx:dropdownFactory> 
      <mx:Component> 
       <mx:List scaleX="5" scaleY="5"/> 
      </mx:Component> 
     </mx:dropdownFactory> 
    </mx:ComboBox> 

Не уверен, что другие модификации, которые вы, возможно, потребуется сделать, чтобы получить все List's компоненты рендеринга в правильном масштабе.

0

Не pefect, но по крайней мере что-то вроде решения. Добавьте открытое событие в поле со списком для масштабирования для parentApplication.

import mx.events.DropdownEvent; 

// workaround combox listbox scalling 
protected function mycombobox_openHandler(event:DropdownEvent):void 
{    
    mycombobox.dropdown.scaleX = parentApplication.scaleX; 
    mycombobox.dropdown.scaleY = parentApplication.scaleY;     
} 
0

Вы можете попробовать monkeypatching Flex SDK :)
Copy mx.controls.Combobox для вашего проекта и изменения линий 1507-1509:

var m:Matrix = transform.concatenatedMatrix; 
_dropdown.scaleX = m.a; //scale x 
_dropdown.scaleY = m.d; //scale y 

к чему-то вроде этого:

_dropdown.scaleX = scaleX; 
_dropdown.scaleY = scaleY; 

К сожалению, вам нужно скопировать некоторые классы из mx.styles.metadata (кто использовал «включить» в SDK, кто ?!)

Смежные вопросы