0

我有一个主应用程序(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;
}  

这是解决方法吗?好解决吗?

4

1 回答 1

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

其作品。

于 2013-04-11T08:20:58.977 回答