如何保持原生窗口的顶部

时间:2009-07-06 17:17:05

标签: flex actionscript-3 air

我需要在应用程序的主窗口之上保留我正在创建的NativeWindow。

目前我使用的是alwaysInFront = true,它不仅限于应用程序中的窗口。我可以成功同步最小化/恢复/移动/调整大小操作,因此顶窗在这些情况下表现得恰当。尽管使用此选项的缺点是,如果我将alt-tab添加到其他应用程序,则该窗口将位于另一个应用程序之上。

由于上述原因,我试图在不使用alwaysInFront的情况下使其工作。我已经尝试过使用orderInFrontOf和orderToFront,它将它固定到位但是当我点击主窗口中的一个区域时,顶部的一个区域变得隐藏,即空气使它成为最顶层的区域。

我已尝试捕获激活/停用事件,但它仅在第一次点击时发生,因此在第二次点击时,顶部窗口将再次隐藏。当主要窗口变为活动状态时,我也尝试使顶部窗口处于活动状态,但这会导致主窗口失去焦点,我无法点击任何东西。

聚苯乙烯。我这样做是为了改善我正在使用的HTMLOverlay的行为 - 请参阅Flex Air HTMLLoader blank pop up window when flash content is loaded

3 个答案:

答案 0 :(得分:0)

倾听Event.DEACTIVATE并致电event.preventDefault()应该有效。不确定这是否是你尝试过的,但我有一个应用程序可以解决问题。

答案 1 :(得分:0)

我最终根据主窗口或顶部窗口是否处于活动状态来打开/关闭alwaysInFront选项,即如果没有活动,我将其关闭。这是我在问题中提到的另外一点。

这样,当用户切换到另一个应用程序时,该窗口不会在其他应用程序之上。我仍然更喜欢一个解决方案,我不必使用alwaysInFront选项,或者更好的替代方案来解决我在上面链接的外部站点中的flex加载flash问题。

聚苯乙烯。我将尝试与HTMLOverlay的所有者一起检查以提交补丁(这是一项改进,虽然它与打开叠加时不会打开额外窗口的应用程序绑定)。

更新:我已将更改提交给HTMLOverlay。

答案 2 :(得分:0)

我正在尝试做一些非常相似的事情。在AIR应用程序中,我有一个大的全屏窗口,基本上是“桌面”。我总是希望这个窗口留在我的应用程序中的所有其他窗口后面。但是,“桌面”窗口中有一些项目需要可点击。

似乎没有干净的方法强制窗口在窗口排序中保持其位置。

到目前为止,我已经解决的问题是,我的应用程序中的所有其他窗口都使用alwaysOnTop属性,但绑定这是一个全局变量(ugh)我维护以跟踪整个应用程序级别的活动/非活动状态。这样,当我切换到另一个应用程序时,我的窗口不会漂浮在所有其他应用程序窗口之上 - 它们正确地按预期移动。

然后,我有一个常规(alwaysOnTop = false)窗口,它完全透明,作为桌面窗口的“叠加”,我可以放置各种交互式控件。这个窗口可以提出,因为它是透明的我的其他窗口总是在上面。

最后,至关重要的是,我在“桌面”窗口中安装了三个事件监听器,如下所示:

protected function onApplicationComplete(event:Event):void
{
    this.addEventListener(MouseEvent.MOUSE_DOWN, onClickHandler, true,1000,true);
    this.addEventListener(MouseEvent.CLICK, onClickHandler, true,1000,true);
    this.nativeWindow.addEventListener(Event.ACTIVATE, onActivateWindow,false,-1);
}

protected function onActivateWindow(event:Event):void
{
    trace("sent via activate to back");
    orderInBackOf(bigTransparentWindow);
}

protected function onClickHandler(event:MouseEvent):void
{
    trace("sent via click to back");
    orderInBackOf(bigTransparentWindow);
}

我对这一切并不完全满意,因为在覆盖窗口中仍有一些偶然明显的对象闪烁 - 看起来“桌面”窗口在它前面被排序,发生了某种更新,并且然后它再次被迫落后。

欢迎任何更好的解决方案!