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));
}
}
public class RegisteringPreloader extends DownloadProgressBar {
override public function initialize():void {
super.initialize();
Singleton.registerClass("mx.managers::IPopUpManager", MyPopupManager);
}
}
2条答案
按热度按时间cygmwpex1#
要做到这一点并不容易。你可以这样做:
创建自定义PopupManager
我们创建了一个自定义的PopupManager类,我们可以在其中添加一些自定义功能。例如,在您的情况下,在Application上调度一个事件可能会很有趣,这样我们就可以从displayList上的任何地方侦听它。我们将扩展PopUpManagerImpl,这是Flex使用的默认实现。
我们重写addPopup方法以在弹出窗口显示时调度冒泡事件。现在忽略getInstance()方法。稍后我将返回到该方法。您需要知道的是,FlashBuilder不会自动管理您的一些导入,因为这些类被标记为隐藏。无需担心,但您必须为以下内容手动编写导入语句:
告诉Flex使用您的类而不是默认实现
这将是相当容易的:
唯一的问题是Flex已经注册了一个实现,你不能覆盖它,即使你在'preinitialize'上执行它。所以我们必须在Flex开始引导之前完成它。我们将使用一个自定义的预加载器:
DownloadProgressBar是默认的Flex预加载器。我们只是添加了额外的注册代码。现在,不要忘记告诉您的应用程序使用此预加载器:
"现在就听这件事"
额外信息
现在为什么MyPopupManager必须有一个静态的getInstance()方法呢?这是因为我们用来注册实现的Singleton类,期望它注册的每个类都是一个singleton,因此有一个名为'getInstance'的方法。它会尝试调用这个方法,如果它不存在,就会崩溃。如果你不知道什么是singleton,只要谷歌一下。你会找到大量的信息。
PS:我实际上学到了一些新的东西,试图解决这个问题(谢谢)。
vwkv1x7d2#
对于我的
Spark
Application
,我不得不对RIAStar的答案做一些其他的修改。我的自定义类还没有在preloader.initialize()
(ApplicationDomain.currentDomain.getDefinition()
)中找到,所以我为PRELOADER_DOC_FRAME_READY
事件添加了一个事件侦听器。其余步骤与RIAStar相同。