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



我正在尝试打开我在 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();

我怎样才能实现目标?

这里的问题是deactivateactivate事件的使用。Event.DEACTIVATEEvent.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
}
}

最新更新