Pregunta

en la aplicación Flex Air, ¿cómo abre una ventana detrás de una activa?

Intenté seguir y parece que no puedo hacer que funcione

<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>

Con este código, esperaría que Window1 se abriera detrás de la ventana de la aplicación principal y, en 3 segundos, Window2 se abriría detrás de la ventana1.Pero si ejecuta esto, Window1 se abrirá en la parte superior de la ventana principal y Window2 se abrirá en la parte superior de la ventana1 y la aplicación principal conservará el enfoque.Esto parece un error en la flexión.Si es así, ¿hay alguna solución para este problema?

No hay solución correcta

Otros consejos

Entonces parece que no hay una buena manera de resolver este problema. Una solución sería agregar el escuchador de eventos para AirEvent.Window_Complete y mover la ventana en el manejador de eventos. Esto parece "correcto" de la solución y funciona para un caso simple como mi ejemplo original. El problema es que este enfoque no funcionó en mi código.

Si mira el código SPARTCOLPONENTS.WINDOW Desde el SDK, verá que se agrega un escuchador de eventos para evento.enter_frame cuando se abre la ventana (en cometidos ()). Luego, en el controlador de eventos, EnterFrameHandler (), mantiene un mostrador, y en el segundo cuadro, despacha el evento AirEvent.Window_Complete. Esto me hace pensar que AirEvent.Window_Completa evento disparará en el segundo cuadro, independientemente del estado de la ventana, aunque el LiveDoc dice:

despachado cuando la ventana completa su diseño inicial y abre la ventana nativa subyacente .

Supongo que mi ventana no estaba llena por el segundo cuadro y, por lo tanto, Falló el pedido.


Así que aquí está mi solución:

Primero, en mi ventana, anulé Abrir (OpenWindowactive). Si OpenWindowActive es falso, agrego un escuchador de eventos para evento.enter_frame. En el controlador de eventos, mantengo un mostrador y, cuando el conteo de fotogramas llega a un cierto número (10 en este momento), muevo la ventana actual detrás de la activa. Esta es una forma muy hacky de moverse por este problema. He estado aumentando el límite y ahora tiene éxito alrededor del 90% del tiempo. Podría continuar aumentando el límite hasta que me puse cerca del 100%, pero odio tener que verificar esta condición cada vez que hago cambios en la ventana. También esta condición podría ser diferente dependiendo de la máquina.

Me encantaría si alguien puede decirme lo errónea que es mi solución y decirme una forma mucho mejor de resolver mi problema ... pero hasta que esto tendrá que hacer ...

¿Hay alguna razón en particular que está configurando el parámetro UsoWeakReference a VERDADERO? De lo contrario, debería ser capaz de llamar:

timer.addEventListener(TimerEvent.TIMER_COMPLETE, openWindow2);

Sin embargo, hay un error en esa línea de código. El evento TIMER_COMPLETE se enciende cuando el temporizador finaliza todos sus ciclos. Has establecido tu temporizador para "disparar" infinitamente. Así que nunca completará sus ciclos.

Debe modificar esa línea de código a la siguiente y debe obtener sus resultados esperados:

timer.addEventListener(TimerEvent.TIMER, openWindow2);




Para abordar su segunda pregunta (por qué Window1 no aparece detrás de la aplicación). A juzgar por el valor de retorno de la función OrderInBackof:

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

Parece que el pedido falla si la ventana es invisible. Puede ser el caso de que, al tener el código en el manejador CreationComplete, está llamando a esta función antes de que la ventana de la aplicación tenga la posibilidad de mostrarse. Intente mover ese código dentro de su función OpenWindow2, también. Yeilding:

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

Espero que esto ayude de alguna manera,

  • gmale

Editar: por mi último comentario Pruebe esto,

        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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top