Flex Widgets - 样式的继承

时间:2013-04-02 19:09:44

标签: css flex actionscript widget styles

我有一个主应用程序(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:应用程序)。

更新1

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

    //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);
        }
    }

这是有效的。