ComboBox下拉缩放不遵循DisplayList

时间:2010-01-13 22:33:57

标签: flex actionscript-3 actionscript flex3

我一直在开发一个应用程序(使用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>

我能用它做的最好的事情就是在ComboBox上添加一个“MouseEvent.MOUSE_DOWN”监听器并像这样处理它:

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

导致下拉列表出现(向下滑动)未缩放,直到达到它的延伸长度并停止,此时它会向上扩展并保持该比例直到它关闭。我还发现,如果你在comboBox或下拉列表上调用“invalidateDisplayList()”,那么它会撤消缩放,所以看起来每当调用updateDisplayList时,下拉列表只应用它的父ComboBox的缩放,而不是ComboBox的父缩放。容器的缩放。

据我所知,作为一个弹出窗口,下拉列表不在Application或ComboBox的displayList树中,这似乎是问题的根源(没有双关语)。

有人对如何解决这个问题有什么见解?

提前致谢!

3 个答案:

答案 0 :(得分: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组件以正确的比例呈现。

答案 1 :(得分:0)

不完美,但至少是一种解决方案。 将打开事件添加到组合框中以扩展到父应用程序。

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

答案 2 :(得分:0)

你可以试试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复制一些类(在SDK中使用“include”,谁?!)