题
在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);
}
. 不隶属于 StackOverflow