Domanda

In Flex Air App, Come apri una finestra dietro una attiva?

Ho provato a seguire e non riesco a farlo funzionare

<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 questo codice, mi aspetterei la finestra1 di aprire dietro la finestra principale dell'app e, in 3 secondi, Window2 si aprirà dietro la finestra1.Ma se si esegue questo, Window1 si aprirà sulla parte superiore della finestra principale e la finestra2 si aprirà in cima alla finestra1 e l'app principale manterrà la messa a fuoco.Questo sembra un bug nel flex.Se è così c'è qualche soluzione per questo problema?

Nessuna soluzione corretta

Altri suggerimenti

Quindi sembra che non ci sia un buon modo per risolvere questo problema. Una soluzione alternativa sarebbe quella di aggiungere listener per eventi per Airevent.window_complete e spostare la finestra nel gestore di eventi. Questo sembra "corretto" workaround e funziona per un semplice caso come il mio esempio originale. Il problema è che questo approccio non ha funzionato sul mio codice.

Se si guarda a Spark.Components.Window Code Dal SDK, vedrai che un listener di eventi per Event.ENTER_FRAME viene aggiunto quando si apre la finestra (in ComitatoProperties ()). Quindi nel gestore di eventi, EnterFrameHandler (), mantiene un contatore e sul secondo fotogramma, spedire Airevent.Window_Complete Event. Questo mi fa pensare che l'evento Airevent.Window_Complete si sparirà sul secondo fotogramma a prescindere dallo stato della finestra anche se il Livedoc dice:

.

Inviato quando la finestra completa il suo layout iniziale e apre il sottostante nativoWindow .

Indovina che la mia finestra non è stata creata piena dal secondo fotogramma e quindi ordinabile è fallito.


.

Quindi ecco la mia soluzione alternativa:

Prima, nella mia finestra, ho sovrascritto Open (OpenWindoWactive). Se OpenWindoWactive è falso, aggiungo un listener di eventi per event.enter_frame. Nel gestore di eventi, tengo un contatore e, quando il conteggio del telaio raggiunge un certo numero (10 in questo momento), spostando la finestra corrente dietro l'ACTIVE. Questo è un modo molto hacky per aggirare questo problema. Ho aumentato il limite e ora riesce a circa il 90% delle volte. Potrei continuare ad aumentare il limite finché non mi avvicino al 100%, ma odio dover controllare questa condizione ogni volta che faccio modifiche alla finestra. Anche questa condizione potrebbe essere diversa a seconda della macchina.

Mi piacerebbe che qualcuno possa dirmi quanto sia sbagliato che la mia soluzione è e dimmi un modo molto migliore per risolvere il mio problema ... ma fino ad allora questo dovrà fare ...

C'è una ragione particolare che stai impostando il parametro di USEAKREFERENCE su true? Altrimenti, dovresti essere in grado di chiamare solo:

timer.addEventListener(TimerEvent.TIMER_COMPLETE, openWindow2);
.

Tuttavia, c'è un bug in quella linea di codice. L'evento Timer_Complete viene sparato quando il timer è terminato tutti i suoi cicli. Hai impostato il tuo timer per "fuoco" infinitamente. Quindi non completerà mai i cicli.

È necessario modificare quella linea di codice su quanto segue e dovresti ottenere i risultati attesi:

timer.addEventListener(TimerEvent.TIMER, openWindow2);
.





. Per indirizzare la tua seconda domanda (perché la finestra1 non appare dietro l'applicazione). A giudicare dal valore di ritorno della funzione OrderInbackof:

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

Sembra che l'ordine fallisca se la finestra è invisibile. Potrebbe essere il caso che, avendo il codice nel gestore CreationComplete, stai chiamando questa funzione prima che la finestra dell'applicazione abbia la possibilità di visualizzarsi. Prova a spostare quel codice all'interno della funzione OpenWindow2, pure. Yeilding:

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

Spero che questo aiuti in qualche modo,

    .
  • GMALE

Modifica: per il mio ultimo commento prova questo,

        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);                    
        }
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top