Question

dans l'application Flex Air, comment ouvrez-vous une fenêtre derrière un actif?

J'ai essayé de suivre et je n'arrive pas à le faire fonctionner

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

Avec ce code, je m'attendrais à ce que la fenêtre puisse ouvrir derrière la fenêtre de l'application principale et, en 3 secondes, Window2 ouvrirait derrière la fenêtre1.Mais si vous exécutez cela, Window1 s'ouvrira sur la fenêtre principale et Window2 s'ouvrira sur la fenêtre1 et l'application principale conservera la mise au point.Cela semble être un bug dans le flex.Si oui, y a-t-il une solution de contournement pour ce problème?

Pas de solution correcte

Autres conseils

Donc, il semble que l'on ne sait pas un bon moyen de résoudre ce problème. Une solution de contournement consisterait à ajouter auditeur d'événements pour Airevent.Window_Complet et déplacez la fenêtre dans le gestionnaire d'événements. Cela semble être une solution de contournement "correcte" et cela fonctionne pour un cas simple comme mon exemple d'origine. Le problème est que cette approche n'a pas fonctionné sur mon code.

Si vous regardez le code Spark.comPonents.Window de la SDK, vous verrez qu'un auditeur d'événement pour Event.Enter_frame est ajouté lors de l'ouverture de la fenêtre (dans EngagementProperties ()). Ensuite, dans le gestionnaire d'événements, En EnterframeHandler (), il conserve un compteur et sur la deuxième image, Dispatch Airevent.Window_Compléte. Cela me fait penser que l'événement Airevent.Window_Complete déclenchera sur la deuxième image quel que soit le statut de la fenêtre, même si la LiveDoc dit:

expédié lorsque la fenêtre complète sa mise en page initiale et ouvre le nativewindow sous-jacent .

Je suppose que ma fenêtre n'était pas complète créée par la deuxième image et donc ordonnez-vous.


Voici ma solution de contournement:

Premier, dans ma fenêtre, je remplace Open (OpenWindowActive). Si openWindowactive est faux, j'ajoute un auditeur d'événements pour Event.Enter_frame. Dans le gestionnaire d'événements, je garde un compteur et, lorsque le nombre de trame atteint un certain nombre (10 maintenant), je déplace la fenêtre actuelle derrière celle active. C'est un moyen très hacrain de contourner ce problème. J'ai augmenté la limite et il réussit maintenant à environ 90% du temps. Je pourrais continuer à augmenter la limite jusqu'à ce que je reçoive de près à 100% mais je déteste avoir à vérifier cette condition chaque fois que je modifie la fenêtre. De plus, cette condition pourrait être différente selon la machine.

J'aimerais que quelqu'un puisse me dire à quel point ma solution de contournement est tort et me dise une bien meilleure façon de résoudre mon problème ... mais jusqu'à ce que cela devra faire ...

Y a-t-il une raison particulière que vous définissez le paramètre UseWeakReferFerence sur True? Sinon, vous devriez pouvoir simplement appeler:

timer.addEventListener(TimerEvent.TIMER_COMPLETE, openWindow2);

Cependant, il y a un bogue dans cette ligne de code. L'événement Timer_Compléte est tiré lorsque la minuterie est terminée tous ses cycles. Vous avez défini votre minuterie pour "tirer" infiniment. Donc, il ne terminera jamais ses cycles.

Vous devez modifier cette ligne de code ci-après et vous devez obtenir vos résultats attendus:

timer.addEventListener(TimerEvent.TIMER, openWindow2);



de
Pour répondre à votre deuxième question (pourquoi Window1 n'apparaît pas derrière l'application). À en juger par la valeur de retour de la fonction OrderInbackOf:

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

Il semble que la commande échoue si la fenêtre est invisible. C'est peut-être le cas que, en ayant le code dans le gestionnaire de créationComplete, vous appelez cette fonction avant que la fenêtre de l'application ait la possibilité de s'afficher. Essayez de déplacer ce code dans votre fonction OpenWindow2, également. Yeilding:

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

J'espère que cela aide d'une manière ou d'une autre,

  • gmale

Edit: par mon dernier commentaire, essayez ceci,

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top