Удалить по заказу TitleWindows в Flex - PullRequest
1 голос
/ 14 июля 2011

Я создаю 3 TitleWindow:

PopUpManager.addPopUp( TitleWindow1, root, false);
PopUpManager.addPopUp( TitleWindow2, root, false);
PopUpManager.addPopUp( TitleWindow3, root, false );

И затем я управляю этими позициями и глубиной, используя мышь.Теперь я хочу удалить их по глубине.В моем TitleWindow добавьте слушателя:

root.addEventListener( KeyboardEvent.KEY_DOWN, onKeyDown );

private function onKeyDown(event:KeyboardEvent = null):void {
     if ( event.keyCode == Keyboard.ESCAPE && this. ) { //!!!! how to detect this window depth, that it at first plan??                 

                event.preventDefault();         
                event.stopImmediatePropagation();

                closeHandler();
            }
        }
   }

Как мне решить эту проблему?

Ответы [ 4 ]

1 голос
/ 15 июля 2011

Теперь я могу предложить одну идею, я использую состояние неактивно:

private function onKeyDown(event:KeyboardEvent = null):void {
        if ( event.keyCode == Keyboard.ESCAPE 
                && this.getCurrentSkinState() != "inactive" ) {

            event.preventDefault();         
            event.stopImmediatePropagation();

            closeHandler();
        }
    }

override protected function stateChanged (oldState:String, newState:String, recursive:Boolean) : void {
        super.stateChanged( oldState, newState, recursive );            
        if ( oldState == "inactive" && newState == "normal" ) {
            PopUpManager.bringToFront( this );
        }
    }
1 голос
/ 14 июля 2011

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

package
{
import flash.display.DisplayObject;

import mx.collections.ArrayCollection;
import mx.core.IFlexDisplayObject;
import mx.core.IFlexModuleFactory;
import mx.core.UIComponent;
import mx.managers.PopUpManager;

public class PopManagerDepth extends PopUpManager
{
    public function PopManagerDepth() { super(); }
    public static var popUpsByDepth :ArrayCollection = new ArrayCollection();
    public static function addPopUpWithDepth(window:IFlexDisplayObject,
                                    parent:DisplayObject,
                                    modal:Boolean = false,
                                    childList:String = null,
                                    moduleFactory:IFlexModuleFactory = null):void
    {
        PopUpManager.addPopUp(window, parent, modal, childList, moduleFactory);
        PopManagerDepth.popUpsByDepth.addItem( window );
    }
    public static function removeLastPopUp():void{
        PopManagerDepth.removePopUpByIndex(PopManagerDepth.popUpsByDepth.length);
    }
    public static function removePopUpByIndex( idx :uint ):void{
        if( PopManagerDepth.popUpsByDepth.length > idx){
            PopUpManager.removePopUp( popUpsByDepth.getItemAt(  idx ) as IFlexDisplayObject );
        }
    }
}
}

Вы бы использовали этот класс для добавления всплывающих окон, как popupmanager, но с помощью этого метода:

PopManagerDepth.addPopUpWithDepth( .... );

Разница в том, что есть новый метод, который вы бы использовали, чтобы удалить их:

PopManagerDepth.removeLastPopUp();

или

PopManagerDepth.removePopUpByIndex();

Должен сделать трюк, извините, я не могу проверить это прямо сейчас, но должен работатьили близко к этому.Я помогу тебе отладить, если нужно:)

0 голосов
/ 14 июля 2011

Вот что я бы сделал:

  1. Создайте Array для отслеживания каждого всплывающего экземпляра TitleWindow. Вы можете использовать Array index в качестве индикатора z-index.
  2. В вашем методе closeHandler() выполните итерацию по каждому члену Array и закройте этот экземпляр TitleWindow.
0 голосов
/ 14 июля 2011

Под глубиной Windows вы имеете в виду z-index? Если это так, вы можете попробовать методы getChildIndex и removeChildAt в классе DisplayObject. Однако, поскольку всплывающие окна существуют в другой иерархии, чем остальные основные компоненты, я не уверен, сработает ли это, но это только начало?

...