我无法将头部缠绕在与其主机组件相关的spark皮肤类上。基本上,从我在Flex 4框架中出现的大多数皮肤看到的情况来看,它们并不直接暴露在主机组件中动态设置的属性。相反,它们定义暴露给外观类的状态,以定义组件应该看起来不同的时间。当你拥有一个标准状态集的非常简单的组件时,这一切都很好,但是当你在主机组件中设置了20个不同的属性(假设)应该改变皮肤的外观时它可能变得非常复杂很快
我已经看到他们习惯于解决这个问题的方法是重写commit属性并使skin类中的函数无效,从那里获取他们想要的属性的值,然后将它们设置为本地实例化皮肤类中的变量。这很好,但我觉得这只是一个修补程序,它使事情变得比它需要的复杂得多。
这是我的问题: 有没有办法直接从宿主组件类公开可绑定属性,所以当你定义你的皮肤类时,它可以直接从中读取?假设您有自定义按钮,其布尔属性为“selected”。在皮肤类中,您希望为属性“selected”添加get和set函数,这样您就可以在设置时对皮肤执行某些操作。你如何告诉皮肤类这是一个可以从主机组件中使用的属性?
答案 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);
}
此外,由于您已存储对外观部件的引用,因此您仍可以在主机组件中随时访问它并进行更新。我清楚了吗? : - )