有没有办法获取当前应用程序中所有皮肤类的列表?我正在使用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);
}
为什么的原因是因为我想列出应用程序中的所有皮肤,然后能够实时应用它们,这样我就可以看到它们的样子。 *我有这个工作,但我希望有更好的方法。
答案 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中设置的任何默认外观或外观。