활성 창 뒤에 열린 창을 엽니 다
-
13-09-2020 - |
문제
Flex AIR App에서는 활성화 된 창 뒤에있는 창을 어떻게 열 수 있습니까?
나는 다음을 시도했고, 나는 그것을 일하게 될 수 없다
<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이 기본 창 위에 열리고 Window2가 Window1 맨 위에 열리고 기본 앱이 포커스를 유지합니다.이것은 Flex의 버그처럼 보입니다.이 문제에 대한 해결 방법이 있으면이 문제가 있습니까?
올바른 솔루션이 없습니다
다른 팁
그래서이 문제를 해결할 수있는 좋은 방법이없는 것처럼 보입니다. 해결 방법은 airevent.window_complete에 대한 이벤트 리스너를 추가하고 이벤트 처리기에서 창을 이동하는 것입니다. 이것은 "올바른"해결책과 같고 원래 예제와 같은 간단한 사례를 위해 작동합니다. 문제는이 접근 방식이 내 코드에서 작동하지 않는다는 것입니다.
SDK에서 Spark.Components.Window 코드를 보면 event.enter_frame for event.enter_frame에 대한 이벤트 리스너가 추가 될 때 추가됩니다 (commitProperties ()). 그런 다음 이벤트 처리기에서 EnterFrameHandler (), 카운터 및 두 번째 프레임에 AirEvent.window_complete 이벤트를 Dispatch합니다. 이렇게하면 LiveDoc이 "
라고하더라도 윈도우의 상태에 관계없이 이벤트가 두 번째 프레임에서 발사 될 것이라고 생각합니다.창 이 초기 레이아웃을 완료하고 기본 윈도우 을 엽니 다.
내 창이 두 번째 프레임에 의해 만들어지지 않았으므로 orderinbackof가 실패했습니다.
그래서 내 해결 방법이 있습니다 :
첫째, 내 창에서 Open (OpenWindowActive)을 덮어 씁니다. openWindowActive가 false이면 이벤트가 event.enter_frame에 대한 이벤트 리스너를 추가합니다. 이벤트 핸들러에서는 카운터를 보관하고 프레임 수가 특정 숫자 (지금 10)에 도달하면 현재 창 뒤에있는 현재 창을 옮깁니다. 이것은이 문제를 해결할 수있는 매우 해피 방식입니다. 나는 한계를 늘리고 이제는 시간의 약 90 %를 성공적으로 성공했습니다. 100 % 가까이에 가깝게 될 때까지 한계를 계속 늘릴 수 있었지만 창을 변경할 때 마다이 상태를 확인해야합니다. 또한이 상태는 기계에 따라 다를 수 있습니다.
누군가가 나의 문제를 얼마나 틀렸는지 말해 줄 수 있는지 말하고 내 문제를 해결할 수있는 훨씬 더 좋은 방법을 말해 줄 수 있지만, 이것을해야 할 것입니다 ...
useWeakReference 매개 변수를 true로 설정하는 특별한 이유가 있습니까? 그렇지 않으면 다음과 같이 전화 할 수 있어야합니다.
timer.addEventListener(TimerEvent.TIMER_COMPLETE, openWindow2);
.
그러나 해당 코드 줄에 버그가 있습니다. 타이머가 모든주기를 완료하면 TIMER_COMPLETE 이벤트가 실행됩니다. 당신은 당신의 타이머를 무한히 "화재"하도록 설정했습니다. 그래서 그것은 결코주기를 완성하지 않습니다.
해당 코드 행을 다음과 같이 수정해야하며 예상 결과를 얻어야합니다.
timer.addEventListener(TimerEvent.TIMER, openWindow2);
.
두 번째 질문을 해결하려면 (Window1이 응용 프로그램 뒤에 나타나지 않는 이유). OrderInbackOf 기능의 반환 값으로 판단 :
Boolean — true if the window was succesfully sent behind;
false if the window is invisible or minimized.
.
창이 보이지 않으면 순서가 실패하는 것 같습니다. CreationComplete 핸들러에 코드를 사용하면 응용 프로그램 창에 자체를 표시 할 수있는 기회가 있기 전에이 함수를 호출하는 경우가 있습니다. OpenWindow2 함수 내에서 해당 코드를 이동하십시오. yeilding :
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);
}
.