Масштаб выпадающего списка ComboBox не соответствует DisplayList - PullRequest
0 голосов
/ 14 января 2010

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

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

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

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

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

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 14 января 2010

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

    <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 голосов
/ 24 ноября 2011

Вы можете попробовать monkeypatching Flex SDK:)
Скопируйте 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 (кто использовал «include» в SDK, кто?!)

0 голосов
/ 23 апреля 2011

Не идеально, но по крайней мере что-то вроде решения. Добавьте событие в ваш выпадающий список, чтобы масштабировать его в 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;                
}
...