【问题标题】:how to keep a nativewindow on top如何将本机窗口保持在顶部
【发布时间】:2009-07-06 17:17:05
【问题描述】:

我需要在应用程序的主窗口顶部保留一个我正在创建的 NativeWindow。

目前我使用的是alwaysInFront = true,它不限于应用程序中的窗口。我可以成功同步最小化/恢复/移动/调整大小操作,因此在这些情况下顶部窗口的行为适当。即使使用这个选项有一个缺点,如果我 alt-tab 到其他应用程序,窗口会在其他应用程序之上。

由于上述原因,我试图在不使用 alwaysInFront 的情况下让它工作。我曾尝试使用 orderInFrontOf 和 orderToFront,它可以将其放置到位,但是当我单击主窗口中的一个区域时,顶部的区域会被隐藏,即空气使其成为顶部。

我尝试捕获激活/停用事件,但它只发生在第一次单击时,所以在第二次单击时顶部窗口再次隐藏。我还尝试在主窗口处于活动状态时使顶部窗口处于活动状态,但这会导致主窗口失去焦点并且我无法单击任何内容。

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

【问题讨论】:

    标签: apache-flex actionscript-3 air


    【解决方案1】:

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

    【讨论】:

    • 谢谢,不幸的是,这在我的场景中不起作用。我的猜测是,在您的应用程序中,您使用了 alwaysInFront 并取消了停用,因此它永远不会关闭,或者您只是想要一个在主窗口最小化时保持打开的窗口。似乎问题在于,如果我不使用 alwaysInFront 选项,那么当空气将焦点转移到主窗口时,它会将其置于顶部,而我找不到阻止它的方法。
    • 我发现 AIR 的窗口处理有些欠缺……无法创建正确的模态对话框有时很痛苦。
    【解决方案2】:

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

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

    附言。我将尝试与 HTMLOverlay 的所有者核实以提交补丁(这是一项改进,尽管它与打开覆盖时不打开额外窗口的应用程序相关联)。

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

    【讨论】:

      【解决方案3】:

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

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

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

      然后,我有一个常规的 (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);
      }
      

      我对这一切并不完全满意,因为在覆盖窗口中仍然偶尔会出现一些明显的对象闪烁 - “桌面”窗口似乎在它前面排序,发生了某种更新,并且然后它又被逼到后面。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-07
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 2011-03-15
        • 2015-02-08
        • 2022-12-09
        相关资源
        最近更新 更多