【问题标题】:Is there a way to get a list of all skin classes in the current application?有没有办法获取当前应用程序中所有皮肤类的列表?
【发布时间】:2011-07-04 07:53:41
【问题描述】:

有没有办法获取当前应用程序中所有皮肤类的列表?我正在使用 Flex 4.5.1。

这是我现在用来获取所有皮肤的循环,

            for each (var item:Object in styleManager.typeHierarchyCache) {

                for (label in item) {

                    if (label=="spark.components.supportClasses.Skin" ||
                        label=="spark.skins.mobile.supportClasses.MobileSkin") {

                        for (label in item) {
                            name = label.substr(label.lastIndexOf(".")+1);
                            vo = new SkinObject();
                            vo.name = name;
                            vo.qualifiedName = label;
                            dictionary[label] = vo;
                        }
                        break;
                    }

                }

            }

            for each (item in dictionary) {
                array.push(item);
            }

为什么的原因是因为我想列出应用程序中的所有皮肤,然后能够实时应用它们,这样我就可以看到它们的样子。 * 我有这个工作,但我希望有更好的方法。

【问题讨论】:

  • 您是指在 FlashBuilder 中还是在一般情况下?
  • 使用AS3;我不知道如何将所有类编译成最终的 SWF。即使你可以;您将如何定义皮肤类和非皮肤类之间的区别。 W/ 4.5.1 支持 ActionScript 皮肤;您不能 100% 依赖 SparkSkin 类作为所有皮肤的父级。为什么要这样做?
  • @flextras - 我也不知道。好吧,styleManager 包含 typeHierarchyCache 中的类型列表。该列表中列出了 ui 组件和皮肤。我可以通过检查基类来过滤列表以获取皮肤。我将在操作中发布一个代码 sn-p。
  • 如果编译成 swc,会生成一个 catalog.xml 文件,其中包含项目中的所有文件名。您可以选择解析该文件吗?
  • @RIAStar - 里面没有任何特定于皮肤的东西

标签: apache-flex flex4 skinning flex-spark


【解决方案1】:

您绝对可以遍历屏幕上的所有对象,看看它们是否属于 SparkSkin 类型。像这样的:

private function findSkins():void
{
    recurseComponent(FlexGlobals.topLevelApplication);
}

private function recurseComponent(parent:UIComponent):void
{
    var child:UIComponent;
    for(var i:uint = 0, len:uint = parent.numElements; i<len; i++)
    {
        child = parent.getElementAt(i) as UIComponent;
        if(child && child is SparkSkin)
        {
            trace("Skin Found!"); // trace whatever you need here
        }
        recurseComponent(child);
    }
}

但请注意,此解决方案非常昂贵,因为它需要遍历屏幕上的所有对象,这可能会达到数千个。但是,我真的不明白这样做的目的是什么,除了用于调试/测试目的之外,我绝对不会推荐它。

编辑:此外,这仅适用于显示列表中的皮肤。 CSS 中提到的皮肤将不会被识别,我很确定除了遍历所有 css 并查看是否有 skinClass 属性之外,没有办法弄清楚这一点。但是它不会捕获任何默认皮肤或在 actionscript 或内联 mxml 中设置的皮肤。

【讨论】:

  • 对。您发布的代码只会通过显示列表。我发布的代码获得了所有的皮肤。它只是很笨拙,如果没有很多其他工作,它不会给我我正在寻找的东西。
  • 样式管理器不会给你所有的皮肤。只有在css 中指定的那些已经被加载。内联且未加载的可能不会显示。同样,不要看到这样做的目的,也不应该首先这样做。
  • 感谢 JAX 和大家。我暂时搁置它。
猜你喜欢
  • 1970-01-01
  • 2011-09-26
  • 2011-10-27
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多