Есть ли способ получить список всех классов скинов в текущем приложении?

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

Причина почему в том, что я хочу составить список всех скинов в приложении, а затем иметь возможность применять их в режиме реального времени, чтобы видеть, как они выглядят. * У меня это работает, но я надеялся на лучший способ.


person 1.21 gigawatts    schedule 04.07.2011    source источник
comment
Вы имеете в виду во FlashBuilder или вообще?   -  person RIAstar    schedule 04.07.2011
comment
Использование AS3; Я не знаю, как собрать все классы в окончательный SWF. Даже если бы вы могли; как бы вы определили разницу между классом скина и классом без скина. W/ 4.5.1 с поддержкой скинов ActionScript; вы не можете на 100 % полагаться на то, что класс SparkSkin является родителем всех скинов. почему ты хочешь сделать это?   -  person JeffryHouser    schedule 04.07.2011
comment
@flextras - я тоже. хорошо, styleManager содержит список типов в typeHeirarchyCache. в этом списке перечислены как компоненты пользовательского интерфейса, так и скины. я могу отфильтровать список, чтобы получить скины, проверив базовый класс. я опубликую фрагмент кода в op.   -  person 1.21 gigawatts    schedule 05.07.2011
comment
При компиляции в swc создается файл catalog.xml, содержащий имена всех файлов проекта. Есть ли у вас возможность разобрать этот файл?   -  person RIAstar    schedule 05.07.2011
comment
@RIAStar - в нем нет ничего особенного для скинов   -  person 1.21 gigawatts    schedule 09.07.2011
comment
Если бы вы использовали соглашение об именах, согласно которому все классы скинов заканчиваются словом «Skin» (как это делают все скины Spark), вы могли бы их проанализировать.   -  person RIAstar    schedule 09.07.2011


Ответы (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.

person J_A_X    schedule 05.07.2011
comment
Правильно. Размещенный вами код будет проходить только через список отображения. Код, который я разместил, получает все скины. Это просто глупо и не дает мне того, что я ищу, без большого количества другой работы. - person 1.21 gigawatts; 09.07.2011
comment
Менеджер стилей не даст вам все скины. Только те, которые указаны в css или встроенные, которые уже были загружены. Те, которые встроены и не загружены, вероятно, не будут отображаться. Опять же, не вижу цели этого и не должен делать этого в первую очередь. - person J_A_X; 11.07.2011
comment
Спасибо JAX и всем. Я откладываю это пока. - person 1.21 gigawatts; 23.07.2011