Flex janela aberta atrás da janela ativa
-
13-09-2020 - |
Pergunta
No Flex Ar aplicativo, como faço para abrir uma janela atrás de um ativo?
Tentei seguir e eu não consigo fazê-lo funcionar
<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>
Com esse código, eu esperaria window1 para abrir atrás da janela do aplicativo e, em 3 segundos, window2 seria aberta atrás de window1.Mas se você executar este, window1 será aberto no topo da janela principal, e window2 será aberto no topo de window1 e o principal aplicativo irá manter o foco.Este parece ser um bug no Flex.Se assim é, existe alguma solução para este problema?
Nenhuma solução correta
Outras dicas
Assim, parece que não é uma boa maneira de resolver este problema.Uma solução alternativa seria adicionar um ouvinte de evento para AIREvent.WINDOW_COMPLETE e mover a janela do manipulador de eventos.Este parece ser "correto" solução e funciona para um caso simples como o meu exemplo original.O problema é que essa abordagem não funciona no meu código.
Se você olhar para a vela.componentes.Janela de código do sdk, você vai ver que um ouvinte de evento para Evento.ENTER_FRAME é adicionado ao abrir a janela (em commitProperties()).Em seguida, o manipulador de eventos, enterFrameHandler(), ele mantém um contador, e no segundo quadro, a expedição AIREvent.WINDOW_COMPLETE evento.Isso me faz pensar que AIREvent.WINDOW_COMPLETE evento será acionado no segundo quadro, independentemente do status da janela, mesmo que o livedoc diz:
Despachado quando a Janela conclui o seu layout inicial e abre subjacente NativeWindow.
Eu estou supondo que a minha janela não estava completo criado pelo segundo quadro e, portanto, orderInBackOf falhou.
Então aqui está a minha solução:
Primeiro, na minha janela, eu substituir aberto(openWindowActive).Se openWindowActive é falso, eu adicionar um ouvinte de evento para Evento.ENTER_FRAME.No manipulador de eventos, eu tenho um contador e, quando o quadro chega a contagem de um determinado número (10 agora), eu mover a janela atual para trás o ativo.Este é um MUITO hacky forma de contornar este problema.Eu tenho vindo a aumentar o limite e agora ele consegue cerca de 90% do tempo.Eu poderia continuar a aumentar o limite até eu chegar perto de 100%, mas eu odeio ter que verificar essa condição toda vez que eu fazer alterações para a janela.Também esta condição poderia ser diferente, dependendo da máquina.
Eu adoraria se alguém pode me dizer como errada a minha solução é e diga-me muito melhor maneira para resolver meu problema...mas até então isso vai ter que fazer...
Há uma razão particular que você está definindo a useWeakReference parâmetro para true?Caso contrário, você deve ser capaz de chamada:
timer.addEventListener(TimerEvent.TIMER_COMPLETE, openWindow2);
No entanto, há um erro na linha de código.O TIMER_COMPLETE evento é acionado quando o temporizador terminar todos os seus ciclos.Você tem de definir o temporizador para o "fogo" infinitamente.Por isso nunca vai concluir da ciclos.
Você precisa modificar essa linha de código para o seguinte e você deve obter seus resultados esperados:
timer.addEventListener(TimerEvent.TIMER, openWindow2);
Para resolver a segunda questão (por window1 não aparece por trás do aplicativo).A julgar pelo valor de retorno do orderInBackOf função:
Boolean — true if the window was succesfully sent behind;
false if the window is invisible or minimized.
Parece que a ordenação falha se a janela é invisível.Pode ser o caso de que, por ter o código no creationComplete manipulador, o que você está chamando esta função antes de a janela do Aplicativo tem uma chance de exibir-se.Tente mover o código dentro de seu openWindow2 função, bem.Yeilding:
private function openWindow2(event:TimerEvent):void
{
window1.orderInBackOf(this);
window2.open(false);
window2.orderInBackOf(window1);
}
Espero que isso ajude de alguma forma,
- gMale
EDITAR:por meu último comentário tentar fazer isso,
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);
}