2013-04-02 75 views
0

我有一个主要应用程序(Flex 4.6),其中我打算使用任意数量的小部件。小部件是.swf文件(s:模块或s:应用程序,Flex 4.6)。Flex小部件 - 风格的继承

我的问题是,加载的小部件不会继承正在使用它的应用程序的样式。

简而言之,我从服务器加载小部件作为.swf文件(使用URLLoader类)。下载它之后,我创建了小部件的实例(而单个小部件可以在主要应用程序中放在几个不同的地方 - 相乘)。

在主应用程序,以下CSS文件用于:

<fx:Style source="css/common.css" /> 

common.css内容是:

s|TextInput { 
    contentBackgroundColor: #9FD1F2; 
    focusColor: #8FD7F9; 
    skinClass: ClassReference("skins.textInputTestSkin"); 
} 


s|Label { 
    color: #2211FF; 
} 

这就是我如何创建并加载部件:

private var bytesLoader:Loader = null; 
public var loadedApp:SystemManager = null; 
public var loadedModule:Module = null; 

... 

bytesLoader.addEventListener(Event.COMPLETE, onBytesLoaderComplete); 
var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain); 
bytesLoader.loadBytes(urlLoader.data, context); 

... 


private function onBytesLoaderComplete(e:Event):void { 
    var dataContent:DisplayObject = bytesLoader.content; 

    //(Application) 
    if(dataContent && (dataContent is SystemManager)) { 
     loadedApp = dataContent as SystemManager; 
     loadedApp.addEventListener(FlexEvent.APPLICATION_COMPLETE,appWidgetCreationComplete); 

     appHolder.addChild(dataContent); 
    } else if(dataContent is IFlexModuleFactory) { 
     //(Module) 
     var moduleLoader:LoaderInfo = LoaderInfo(e.target); 
     moduleLoader.content.addEventListener("ready", moduleWidgetReadyHandler); 
    } 
} 



private function moduleWidgetReadyHandler(e:Event):void { 
    var factory:IFlexModuleFactory = IFlexModuleFactory(e.target); 
    if(factory) { 
     loadedModule = factory.create() as Module; 

     if(loadedModule) { 
     this.addElement(loadedModule); 
     } 
    } 
} 

我的问题是第一,我可以以什么方式将父母的风格应用于小部件,其次(s:Module),我可以通过什么方式在小部件上应用父母的样式(s:Application)。

更新1

如果我改变吸气的moduleFactory在每一个窗口小部件(如下图所示),样式都设置得恰到好处。这意味着小部件(模块和应用程序)中的textInput具有与主应用程序中相同的外观。

override public function get moduleFactory():IFlexModuleFactory { 
    return FlexGlobals.topLevelApplication.moduleFactory; 
} 

它的解决方法吗?这是很好的解决方案?

回答

0

好的,这是一个解决方案:

添加之前bytesLoader.loadBytes(urlLoader.data,背景);

//init - moduleFactory 
    bytesLoader.contentLoaderInfo.addEventListener(Event.INIT, onContentLoaderInfoInit); 


    private function onContentLoaderInfoInit(e:Event):void { 
     if(bytesLoader && bytesLoader.contentLoaderInfo) { 
      bytesLoader.contentLoaderInfo.removeEventListener(Event.INIT, onContentLoaderInfoInit); 
     } 

     var loaderInfo:LoaderInfo = LoaderInfo(e.target); 
     loaderInfo.content.addEventListener(Request.GET_PARENT_FLEX_MODULE_FACTORY_REQUEST, onGetParentModuleFactoryRequest); 
    } 


    private function onGetParentModuleFactoryRequest(r:Request):void { 
     if(isGlobalStyleAllowed) { 
      if ("value" in r) { 
       r["value"] = FlexGlobals.topLevelApplication.moduleFactory; 
      } 
     } 

     //remove eventListener 
     if(bytesLoader && bytesLoader.contentLoaderInfo) { 
      var loaderInfo:LoaderInfo = LoaderInfo(bytesLoader.contentLoaderInfo); 
      loaderInfo.content.removeEventListener(Request.GET_PARENT_FLEX_MODULE_FACTORY_REQUEST, onGetParentModuleFactoryRequest); 
     } 
    } 

它的作品。