在Flex Air应用程序中,您如何打开一个活动的窗口?

我试过关注,我似乎无法完成工作

<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark" 
                       xmlns:mx="library://ns.adobe.com/flex/mx"
                       creationComplete="onCreationComplete(event)">

    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            import spark.components.Window;

            private var window1:Window  = new Window();
            private var window2:Window  = new Window();
            private var timer:Timer     = new Timer(3000,1);

            private function onCreationComplete(event:FlexEvent):void
            {
                window1         = new Window();
                window1.title   = "Window 1";
                window1.width   = 200;
                window1.height  = 200;
                window1.open(false);
                window1.orderInBackOf(this);

                window2         = new Window();
                window2.title   = "Window 2";
                window2.width   = 200;
                window2.height  = 200;

                timer.addEventListener(TimerEvent.TIMER_COMPLETE, openWindow2, false, 0, true);
                timer.start();          
            }

            private function openWindow2(event:TimerEvent):void
            {
                window2.open(false);    
                window2.orderInBackOf(window1);
            }
        ]]>
    </fx:Script>
</s:WindowedApplication>
. 使用此代码,我希望Window1在主应用程序窗口后面打开,在3秒内,Window2将在Window1后面打开。但是如果执行此操作,Window1将在主窗口的顶部打开,窗口2将在窗口1顶部打开,主应用程序将保留焦点。这似乎是柔性中的一个错误。如果是这样的话,这个问题有什么解决方法吗?

没有正确的解决方案

其他提示

所以似乎没有好方法来解决这个问题。解决方法是为Airevent.Window_Complete添加事件侦听器并在事件处理程序中移动窗口。这似乎是“正确”的解决方法,它适用于像我原来的一个简单的案例。问题是这种方法没有在我的代码上工作。

如果从SDK查看Spark.Components.Window代码,您将看到打开窗口时添加for ence.enter_frame的事件侦听器(在CommitProperties())中。然后在事件处理程序中,它会保留一个计数器,并在第二帧上调度airevent.window_complete事件。这让我认为airevent.window_complete事件将在第二帧上射击,而且窗口的状态,即使Livedoc说:

播出窗口完成其初始布局并打开底层NativeWindow

我猜我的窗口并不完全由第二帧创建,因此OrderInbackof失败。


所以这是我的解决方法:

首先,在我的窗口中,我覆盖打开(OpenWindowactive)。如果OpenWindowActive为false,则我为event.enter_frame添加一个事件侦听器。在事件处理程序中,我保留一个计数器,当帧计数达到一定数量时(现在为10),我将当前窗口移动在活动之后。这是一种非常谨慎的方式来解决这个问题。我一直在增加限制,现在它成功了大约90%的时间。我可以继续增加限制,直到我接近100%,但我讨厌每次对窗口进行任何更改时检查这个条件。此条件也可能不同于机器。

我会喜欢它如果有人能告诉我我的解决方法有多错误,并告诉我一个更好的方法来解决我的问题......但直到那么这将不得不做...

是否有一个特定的原因您将useweakReference参数设置为true?否则,您应该只需打电话:

timer.addEventListener(TimerEvent.TIMER_COMPLETE, openWindow2);
. 但是,该行的代码中有一个错误。当定时器完成所有周期时,将触发Timer_Complete事件。您已将定时器设置为“Fire”无限。所以它永远不会完成它的周期。

您需要将该行代码进行修改到以下内容,您应该获取您的预期结果:

timer.addEventListener(TimerEvent.TIMER, openWindow2);
.




要解决您的第二个问题(为什么窗口1不会出现在应用程序后面)。通过OrderInbackof函数的返回值来判断:

Boolean  — true if the window was succesfully sent behind;
           false if the window is invisible or minimized. 
.

如果窗口是不可见的,似乎排序失败。可能是这种情况,通过在创建符合处理程序中具有代码,在应用程序窗口有机会显示本身之前,您正在调用此函数。同时尝试在OpenWindow2功能中移动该代码。尤金:

        private function openWindow2(event:TimerEvent):void
        {
            window1.orderInBackOf(this);
            window2.open(false);    
            window2.orderInBackOf(window1);
        }
.

我希望这有点有所帮助,

  • gmale

编辑:根据我的最后一条评论,尝试这个,

        private function openWindow2(event:TimerEvent):void
        {
            window1.depth = 5; //arbitrary number
            window2.depth = 4;
            window1.open(false); //assumes window1 isn't opened before
            window2.open(false);                    
        }
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top