我一直在开发一个应用程序(使用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或dropdown上调用"invalidateDisplayList()“,那么它将取消缩放,因此无论何时调用updateDisplayList,dropdown似乎只应用其父组合框的缩放,而不应用组合框的父容器的缩放。
我知道,作为一个弹出窗口,下拉菜单不在应用程序或组合框的displayList树中,这似乎是问题的根源(没有双关语的意思)。
有人对如何解决这个问题有什么见解吗?
提前感谢!
发布于 2010-01-14 07:46:52
一种选择是使用工厂来生成下拉列表,如下所示:
<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组件。
发布于 2011-04-23 22:25:01
不是完美的,但至少是一种解决方案。将打开的事件添加到您的组合框,以便缩放到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;
}发布于 2011-11-24 06:03:51
您可以尝试使用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“,是谁?!)
https://stackoverflow.com/questions/2060812
复制相似问题