我正在尝试打开我在 Spark 中创建的实用程序窗口。
场景是:当应用程序被停用时,我必须打开实用程序窗口。 当应用程序被激活时,实用程序窗口应该关闭。
但是当我打开窗口myUtilityWin.open(false)
时停用时,当窗口打开时,我的应用程序被激活并且实用程序窗口被关闭。
MyUtilityWindow.mxml
<s:Window xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" backgroundAlpha="0" systemChrome="none" type="utility" showStatusBar="false" transparent="true" alwaysInFront="true">
//法典
我如何打开我的实用程序窗口:
myUtilityWin = new MyUtilityWindow();
myUtilityWin.open(false);
myUtilityWin.alwaysInFront = true;
myUtilityWin.orderToFront();
我怎样才能实现目标?
这里的问题是deactivate
、activate
事件的使用。Event.DEACTIVATE
和Event.ACTIVATE
是程序范围的事件,由所有事件调度程序调度"当 Flash Player 或 AIR 应用程序运行失去或获得系统焦点时"调度 停用引用,激活引用。
当您在deactivate
期间调用Window.open(); Window.orderToFront();
时,您正在请求系统焦点,这将在下次屏幕刷新时触发activate
广播。没有办法避免这种情况,这是在Flash的基类中编码的,你必须重写EventDispatcher
才能阻止它。
我的建议是构建一个静态类(或使用顶级应用程序来处理Window
对象。
应用程序类示例:
public function openWindow(window:Window,openActiveWindow:Boolean,alwaysInFront:Boolean,orderToFront:Boolean):void{
window.addEventListener(Event.CLOSE,windowClosed);
window.open(openActiveWindow);
window.alwaysInFront = alwaysInFront;
if (orderToFront) window.orderToFront();
}
private function windowClosed(event:Event):void{
if (event is myUtilityWindow){
//utility window just closed act accordingly
}
else {
//a window of another type closed open utility window
}
}