有没有办法获取当前应用程序中所有皮肤类的列表?

时间:2011-07-04 07:53:42

标签: flex flex4 skinning flex-spark

有没有办法获取当前应用程序中所有皮肤类的列表?我正在使用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);
            }

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

1 个答案:

答案 0 :(得分:0)

你绝对可以迭代遍历屏幕上的所有对象并查看它们是否属于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属性。但是它不会捕获动作脚本或内联mxml中设置的任何默认外观或外观。