Flex: найдите самое всплывающее окно - PullRequest
1 голос
/ 30 марта 2011

С помощью PopupManager можно добавить / создать / удалить новое всплывающее окно. Но я не могу найти способ получить самый всплывающий список без переопределения этого класса (что вы хотите сделать для большого приложения Flex).

Пока что я нашел это решение, которое больше похоже на обходной путь. Поэтому, если у кого-то есть лучшее решение, я буду очень рад прочитать его.

Предполагается, что вы вызываете addPopup / createPopup с параметром PopUpManagerChildList.POPUP, пример:

PopUpManager.createPopUp(parent,MyPopupClass,true,PopUpManagerChildList.POPUP);

Эта функция вернет самое всплывающее окно:

private function getTopMostPopup():void
{

     var childList:IChildList = Application.application.systemManager.popUpChildren;
     for (var i:int = childList.numChildren - 1; i > 0; i--)
     {
          var child:DisplayObject = childList.getChildAt( i );
          if (child is Container)
               return child;
     }
     return null;
}

Application.application.systemManager.popUpChildren содержит все объекты DisplayObject, отображаемые с помощью PopupManager. Но многие из itemRenderers ваших компонентов могут быть в этом списке, даже если они не видны на экране. Вот почему моя функция получает последний дочерний элемент, наследуемый от Container (ваше всплывающее окно должно наследоваться от Container).

1 Ответ

2 голосов
/ 30 марта 2011

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

package com.michelboudreau.utils {

    import flash.display.DisplayObject;
    import flash.utils.Dictionary;

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

    public class CustomPopUpManager {

        private static var popUps:Dictionary = new Dictionary();

        public function CustomPopUpManager()
        {
            throw new Error("CustomPopUpManager is a static class. Cannot create instance.");
        }

        /**
         * Creates a top-level window and places it above other windows in the z-order.
         * 
         * @param id:String - the id of the pop up
         * @param container:DisplayObject - DisplayObject to be used for determining which SystemManager's layers to use and optionally the reference point for centering the new top level window. It may not be the actual parent of the popup as all popups are parented by the SystemManager.
         * @param className:Class - Class of object that is to be created for the popup. The class must implement IFlexDisplayObject.
         * @param modal:Boolean(default = false) — If true, the window is modal which means that the user will not be able to interact with other popups until the window is removed
         * @param center:Boolean(default = false) - Centers a popup window over whatever window was use as container
         * @param childList:String (default = null) — The child list in which to add the popup. One of PopUpManagerChildList.APPLICATION, PopUpManagerChildList.POPUP, or PopUpManagerChildList.PARENT (default). 
         * 
         * @return IFlexDisplayObject — Reference to new top-level window
         */
        public static function createPopUp(id:String, container:DisplayObject, className:Class, modal:Boolean = false, center:Boolean = false, childList:String = null ):IFlexDisplayObject
        {
            if (getPopUpByID(id))
            {
                return getPopUpByID(id);
            }else{
                var popUp:IFlexDisplayObject = PopUpManager.createPopUp(container, className, modal, childList);

                if (center)
                {
                    PopUpManager.centerPopUp(popUp);
                }

                popUps[id] = popUp;
                return popUp;
            }

        }

        /**
         * Returns a IFlexDisplayObject based on the specified id.
         * 
         * @param id:String - the id of the pop up
         * 
         * @return IFlexDisplayObject — Reference to new top-level window
         */
        public static function getPopUpByID(id:String):IFlexDisplayObject 
        {
            return popUps[id];
        }

        /**
         * Removes all pop ups
         * 
         * @return void
         */
        public static function removeAll():void 
        {
            popUps = new Dictionary();
        }

        /**
         * Removes a popup window popped up by id.
         * 
         * @param id:String - the id of the pop up
         * 
         */
        public static function removePopUpByID(id:String):IFlexDisplayObject 
        {
            var popup:IFlexDisplayObject = getPopUpByID(id);
            if(popup)
            {
                PopUpManager.removePopUp(popup);
                removePopUpData(id);
            }
            return popup;
        }

        /**
         * Removes pop up based on IFlexDisplayObject
         * 
         * @param popUp:IFlexDisplayObject - the pop up to be removed
         */
        public static function removePopUp(popUp:IFlexDisplayObject):void 
        {
            // Always try to remove popup no matter what
            PopUpManager.removePopUp(popUp);

            // Find popup and remove from Dictionary
            for(var id:String in popUps)
            {
                if(popUps[id] == popUp)
                {
                    removePopUpData(id);
                    break;
                }
            }
        }

        /**
         * Removes the pop up data
         * 
         * @param id:String - the id of the pop up
         */
        private static function removePopUpData(id:String):void 
        {
            if(popUps[id])
            {
                popUps[id] = null;
                delete popUps[id];
            }
        }


    }
}

Это должно помочь вам начать. Отсюда, если вы хотите реализовать свою функцию, вы можете создать массив, который будет добавлять / удалять всплывающие окна при их создании / удалении (каждое новое всплывающее окно добавляется в индекс 0), и функция просто возвращает всплывающее окно в индексе 0.

Comprender

...