Нет действительно простого способа достичь этого.Вы можете сделать следующее:
- создать собственный менеджер всплывающих окон
- заставить его отправлять события в Приложение, чтобы вы могли слушать где угодно
- , скажите Flex использовать вашкласс вместо реализации по умолчанию
Создание пользовательского PopupManager
Мы создаем пользовательский класс PopupManager, к которому мы можем добавить некоторые пользовательские функции.В вашем случае, например, было бы интересно отправить событие в Application, чтобы мы могли прослушивать его из любого места в displayList.Мы будем расширять PopUpManagerImpl, который является реализацией по умолчанию, используемой Flex.
public class MyPopupManager extends PopUpManagerImpl {
private static var instance:IPopUpManager;
static public function getInstance():IPopUpManager
{
if (!instance) instance = new MyPopupManager();
return instance;
}
override public function addPopUp(
window:IFlexDisplayObject,
parent:DisplayObject,
modal:Boolean=false,
childList:String=null,
moduleFactory:IFlexModuleFactory=null):void
{
super.addPopUp(window, parent, modal, childList, moduleFactory);
var app:IEventDispatcher =
IEventDispatcher(FlexGlobals.topLevelApplication);
app.dispatchEvent(new Event("popupAdded", true));
}
}
Мы переопределяем метод addPopup для отправки всплывающего события всякий раз, когда отображается всплывающее окно.Пока игнорируйте метод getInstance ().Я вернусь к этому позже.Что вам нужно знать, так это то, что FlashBuilder не будет автоматически управлять некоторыми вашими операциями импорта, поскольку эти классы были помечены как скрытые.Не о чем беспокоиться, но вам придется написать операторы импорта для:
import mx.managers.IPopUpManager;
import mx.managers.PopUpManagerImpl;
Скажите Flex использовать ваш класс вместо реализации по умолчанию
Thisбыло бы довольно просто:
import mx.core.Singleton;
Singleton.registerClass("mx.managers::IPopUpManager", MyPopupManager);
Единственная проблема заключается в том, что Flex уже зарегистрировал реализацию, и вы не можете переопределить ее, даже если вы выполняете это в preinitialize.Поэтому мы должны сделать это до того, как Flex начнет загрузку.Для этого мы будем использовать пользовательский предварительный загрузчик:
public class RegisteringPreloader extends DownloadProgressBar {
override public function initialize():void {
super.initialize();
Singleton.registerClass("mx.managers::IPopUpManager", MyPopupManager);
}
}
DownloadProgressBar является предварительным загрузчиком Flex по умолчанию.Мы просто добавляем дополнительный регистрационный код.Теперь не забудьте указать приложению использовать этот предварительный загрузчик:
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
preloader="RegisteringPreloader" >
Теперь просто прослушайте событие
addEventListener("popupAdded", onPopupAdded);
PopUpManager.addPopUp(new Panel(), this);
Дополнительная информация
Теперь, почему MyPopupManager должен иметь статический метод getInstance ()?Это потому, что тот класс Singleton, который мы использовали для регистрации нашей реализации, ожидает, что каждый класс, который он регистрирует, будет одноэлементным и, следовательно, будет иметь метод с именем 'getInstance'.Он попытается вызвать этот метод и потерпит крах, если он не существует.Если вы не знаете, что такое синглтон, просто Google.Вы найдете тонны информации.
PS: Я действительно узнал что-то новое, пытаясь решить этот вопрос (спасибо за это).