虽然@gustyaquino 的回答是一个很好的建议,但我相信有一个更清洁的解决方案,更适合您正在使用的SkinnablePopUpContainer类。
SkinnablePopUpContainer
有一个通常用于显示弹出窗口的open()方法。根据文档,该open()
方法打开弹出窗口(使用PopUpManager
,就像在@gustyaquino 的代码中一样),但它也起到了过渡效果,最后它调度了一个FlexEvent.OPEN
事件。
此外,SkinnablePopUpContainer
创建一次并重复使用。这就是为什么您的“creationComplete”和“initialize”事件解决方案仅在第一次(实际创建对象时)起作用。请注意,@gustyaquino 的解决方案每次都会弹出一个新窗口。这就是我们在SkinnablePopUpContainer
课程存在之前滚动的方式。
在下面的示例中,我使用“open”事件来检测弹出窗口何时打开并将焦点设置在那里。我相信这是一种更简洁的方法(重新使用弹出窗口并将代码集中TextInput
在弹出类内部)。
应用程序 MXML:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:local="*"
width="100%" height="100%">
<fx:Declarations>
<local:MyPopUp id="poppy" />
</fx:Declarations>
<s:Button label="Open pop up" click="poppy.open(this)" />
</s:Application>
弹出式 MXML:
<?xml version="1.0" encoding="utf-8"?>
<s:SkinnablePopUpContainer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
width="300" height="300"
backgroundColor="#c0c0c0"
open="onPopUpOpened()">
<fx:Script>
<![CDATA[
import mx.managers.PopUpManager;
override public function updatePopUpPosition():void
{
PopUpManager.centerPopUp(this);
// this doesn't work here
//myInput.setFocus();
}
private function onPopUpOpened():void
{
myInput.setFocus();
}
]]>
</fx:Script>
<s:layout>
<s:VerticalLayout paddingLeft="10" paddingRight="10" paddingTop="10"/>
</s:layout>
<s:TextInput id="myInput" width="100%" />
<s:Button label="Close" click="close()"/>
</s:SkinnablePopUpContainer>