Вопрос

в приложении Flex Air, как вы открываете окно за активным?

Я попробовал следовать, и я не могу получить его на работу

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

С помощью этого кода я ожидал, что Window1 открывается за главным окном приложения, и через 3 секунды Window2 откроется за Window1.Но если вы выполните это, Window1 откроется сверху главного окна, и Window2 откроется сверху Window1, и основное приложение сохранит фокус.Это похоже на ошибку в Flex.Если так, есть ли обходной путь для этой проблемы?

Нет правильного решения

Другие советы

Так что кажется, что нет хорошего способа решить эту проблему. Обходной путь будет добавлять слушателя событий для AirEvent.Window_Complete и переместить окно в обработчик событий. Это похоже на «правильный» обходной путь, и он работает для простого случая, как мой первоначальный пример. Проблема в том, что этот подход не работал в моем коде.

Если вы посмотрите на код Spark.comPonents.window из SDK, вы увидите, что прослушиватель событий для Event.enter_Frame добавляется при открытии окна (в CommitProperties ()). Затем в обработчике событий ENTERFRAMEHANDLER () он сохраняет счетчик и на втором кадре, отправка Airevent.Window_Complete событие. Это заставляет меня думать, что Airevent.Window_Complete событие будет огонь на втором кадре, независимо от состояния окна, даже если LiveDoc говорит:

Отправлено, когда окно завершает его начальный макет и открывает базовый waterwindow .

Я предполагаю, что мое окно не было полно создано второй кадром, и, следовательно, ordInbackof не удалось.


Так вот мой обходной путь:

Первый, в моем окне я переопределяю открытую (OpenWindowActive). Если OpenWindowactive является ложным, добавляю слушатель события для Event.enter_Frame. В обработчике событий я держу счетчик и, когда подсчет кадра достигает определенного числа (10 прямо сейчас), я перемещаю текущее окно за активным. Это очень хакивый способ обойти эту проблему. Я увеличивал предел, и теперь он преуспевает на 90% времени. Я мог продолжать увеличивать предел, пока не приблизился к 100%, но ненавижу необходимость проверки этого условия каждый раз, когда я вношу любые изменения в окно. Также это условие может быть разным в зависимости от машины.

Я хотел бы его понравиться, если кто-то может сказать мне, насколько неверно мой обходной путь и скажи мне гораздо лучший способ решить мою проблему ... Но до тех пор это придется делать ...

Есть ли конкретная причина, причина вы устанавливаете параметр UseWeakReference для true? В противном случае вы должны просто позвонить:

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

Однако в этой строке кода есть ошибка. Timer_Complete событие уволено, когда таймер закончен всеми своими циклами. Вы настроили свой таймер на «Огонь» бесконечно. Так что это никогда не завершит его циклы.

Вам необходимо изменить эту строку кода к следующему, и вы должны получить ожидаемые результаты:

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



















Для решения вашего второго вопроса (почему Window1 не появляется за приложением). Судя по возвращению функции orderInbackof:

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

Похоже, что заказ не удается, если окно невидимо. Это может быть тот случай, что имея код в обработчике CreateComplete, вы вызываете эту функцию до того, как окно приложения имеет шанс отображать себя. Попробуйте переместить этот код в рамках функции OpenWindow2. Yeilding:

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

Я надеюсь, что это поможет каким-то образом,

    .
  • gmale

Редактировать: на мой последний комментарий попробуйте это,

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top