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);                    
        }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top