将属性公开给Spark Skin类

时间:2011-09-02 17:42:54

标签: flex actionscript-3 hierarchy access-modifiers class-hierarchy

我无法将头部缠绕在与其主机组件相关的spark皮肤类上。基本上,从我在Flex 4框架中出现的大多数皮肤看到的情况来看,它们并不直接暴露在主机组件中动态设置的属性。相反,它们定义暴露给外观类的状态,以定义组件应该看起来不同的时间。当你拥有一个标准状态集的非常简单的组件时,这一切都很好,但是当你在主机组件中设置了20个不同的属性(假设)应该改变皮肤的外观时它可能变得非常复杂很快

我已经看到他们习惯于解决这个问题的方法是重写commit属性并使skin类中的函数无效,从那里获取他们想要的属性的值,然后将它们设置为本地实例化皮肤类中的变量。这很好,但我觉得这只是一个修补程序,它使事情变得比它需要的复杂得多。

这是我的问题: 有没有办法直接从宿主组件类公开可绑定属性,所以当你定义你的皮肤类时,它可以直接从中读取?假设您有自定义按钮,其布尔属性为“selected”。在皮肤类中,您希望为属性“selected”添加get和set函数,这样您就可以在设置时对皮肤执行某些操作。你如何告诉皮肤类这是一个可以从主机组件中使用的属性?

2 个答案:

答案 0 :(得分:5)

这个问题存在于理论层面。我不清楚你要完成什么,也不清楚你在组件类上设置了什么类型的属性。我怀疑,如果你有20个属性,并且每个属性需要以某种方式与不同的皮肤状态相关联,那么存在架构问题。

但是,我可以尝试回答您的具体问题。

Is there any way to directly expose a bindable property from the
     

主机组件类,因此当您定义皮肤类时,它是直接的   准备好从中读取?

在构建Flex MobileSkins时,他们建议创建一个名为hostComponent的属性,该属性为外观类提供对组件类的引用。 MXML皮肤已经有similar property。如果您使用的是自定义外观,则会使用HostComponent元数据自动创建此属性。因此,从skin类中,您可以使用hostComponent属性访问组件类的属性。

  

假设你有一个布尔属性为的自定义按钮   “选择”。在skin类中,您想要添加get和set   属性“选中”的功能,以便您可以执行某些操作   在你的皮肤上设置它。

我没想到你想要这样做的情况。通常,您不会在skin类上定义要在skin类的实例上显式更改的任何属性。

您可以在属性更改时从组件类调度事件。 [这很常见]。然后使用hostComponent属性在skin类中侦听该事件并更改其中的内容。

还有一种方法可以从组件类中访问外观类实例。因此,您可以使用skin属性直接在外观类上更改属性。

如果不考虑它,我不会采用任何一种方法。理想情况下,组件类和皮肤类应该相互封装;每种方法都会提供依赖性。

答案 1 :(得分:0)

当您影响组件的外观时,可以使用元标记来存储对实际使用的外观部件的引用:

[SkinPart(required="false")]
public var resizeHandle:UIComponent;

然后,当覆盖 partAdded partRemoved 方法时,您将能够在这些外观部件中设置或取消设置任何内容,从基本属性到事件侦听器

override protected function partAdded( partName:String, instance:Object):void
{
    super.partAdded(partName, instance);

    if (instance == resizeHandle) {
            resizeHandle.addEventListener(MouseEvent.MOUSE_DOWN, resizeHandle_mouseDownHandler);
    }
}

override protected function partRemoved(partName:String, instance:Object):void
{
    if (instance == resizeHandle) {
        resizeHandle.removeEventListener(MouseEvent.MOUSE_DOWN, esizeHandle_mouseDownHandler);
    }

    super.partRemoved(partName, instance);
}

此外,由于您已存储对外观部件的引用,因此您仍可以在主机组件中随时访问它并进行更新。我清楚了吗? : - )