Есть ли способ получить список всех классов скинов в текущем приложении? - PullRequest
0 голосов
/ 04 июля 2011

Есть ли способ получить список всех классов обложек, которые есть в текущем приложении? Я использую 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 голосов
/ 05 июля 2011

Вы определенно можете итерировать по всем объектам на экране и посмотреть, имеют ли они тип 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.

...