我一直在开发一个应用程序(使用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树中,这似乎是问题的根源(没有双关语)。
有人对如何解决这个问题有什么见解?
提前致谢!
答案 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”,谁?!)