我有一个主应用程序(Flex 4.6),我打算在其中使用任意数量的小部件。小部件是 .swf 文件(s:Module OR s:Application, Flex 4.6)。
我的问题是加载的小部件不会继承使用它的应用程序的样式。
简而言之,我将小部件作为 .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
如果我在每个小部件中更改 getter moduleFactory(如下所示),则样式设置得恰到好处。这意味着小部件(模块和应用程序)中的 textInput 具有与主应用程序中相同的皮肤。
override public function get moduleFactory():IFlexModuleFactory {
return FlexGlobals.topLevelApplication.moduleFactory;
}
这是解决方法吗?好解决吗?