在Air应用程序中打开实用程序窗口(spark)时,防止应用程序处于活动状态

时间:2014-03-06 05:49:54

标签: actionscript-3 flex air desktop-application flex4.5

我正在尝试打开一个实用程序,我在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">

//代码

我如何打开MyUtilityWindow:

 myUtilityWin = new MyUtilityWindow();
 myUtilityWin.open(false);
 myUtilityWin.alwaysInFront = true;
 myUtilityWin.orderToFront();

我如何实现目标?

1 个答案:

答案 0 :(得分:0)

此处的问题是使用deactivateactivate事件。 Event.DEACTIVATEEvent.ACTIVATE是所有事件调度程序调度的程序范围事件,“当Flash Player或AIR应用程序失去或获得系统焦点时,deactivate referenceactivate reference

当您在请求系统焦点的Window.open(); Window.orderToFront();期间呼叫deactivate时,会在下一次屏幕刷新时触发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
    }
}