未在子应用程序中加载的外观(在Flex中)

时间:2010-07-29 09:33:02

标签: flex skinning

我们尝试开发具有多个抽象层的Flash游戏引擎。此flex项目包含:

应用程序(1) - >加载类(2) - >加载另一个实现Flex组件(4)的类(3)。

加载使用SWFLoader。最后一个Flex组件(4)只是一个具有AdvancedDataGrid的组。我们没有定义皮肤所以我认为它必须采用默认皮肤。

问题是在执行期间,会抛出错误,因为在Flex组件(4)中找不到组件的默认外观。在我们的例子中,对于AdvancedDataGrid:

Error #1007: Instantiation attempted on a non-constructor.
mx.controls::AdvancedDataGridBaseEx中的

guilty命令是:getStyle("headerSeparatorSkin");,返回null

目前,我们找到了两个解决方案:

  • 第一个解决方案是将属性headerSeparatorSkin="spark.skins.SparkSkin"添加到Flex组件的AdvancedDataGrid中(4)。但这意味着我必须为组件的每个部分手动添加每个皮肤,这是一个非常无聊的解决方案。

  • 第二个解决方案是在第一个Application(1)中创建一个AdvancedDataGrid。我想它将AdvancedDataGrid添加到编译和链接过程中。但是,这个解决方案并不好,因为Application(1)必须知道Flex组件(4)使用了哪些UIComponents。

我们尝试了编译器选项“keep-all-type-selectors = true”(如this),但没有任何改变。

那么,是否有人有一个解决方案来强制编译器在子应用程序中明确链接Flex组件和他的皮肤?

2 个答案:

答案 0 :(得分:6)

根据Flexmaniak.pl,可以通过将-keep-all-styles-selectors添加到flex编译器参数来解决。

Flex 4.5.1的正确语法为-keep-all-type-selectors

答案 1 :(得分:1)

当我将所有Flex库包含为运行时共享库​​(RSL)时,我遇到了这个问题。我将编译器选项中的框架链接更改为“Merged into code”,并且getStyle(“headerSeparatorSkin”)不再返回null。不确定这是否适合你,但至少它会给你一个提示。