我在围绕spark皮肤类与它的宿主组件相关时遇到了麻烦。基本上,据我所见,Flex4框架中的几乎每个皮肤都不会直接公开在宿主组件中动态设置的属性。相反,它们定义了暴露给皮肤类的状态,以定义组件何时应该看起来不同。当你有一个非常简单的组件和一组标准的状态时,这一切都很好,但是当你有20个不同的属性(假设)要在你的宿主组件中设置,这些属性应该会改变皮肤的外观,它可能很快就会变得非常复杂。
我看到他们用来解决这个问题的方法是覆盖皮肤类中的提交属性和无效函数,从那里获取他们想要的属性的值,然后将它们设置为皮肤类中的一个本地实例化变量。这很好,但我觉得这只是一个补丁解决方案,使事情变得比它需要的复杂得多。
这是我的问题:有没有办法直接公开主机组件类中的可绑定属性,以便在定义皮肤类时可以直接读取它?假设你有一个布尔型属性为'selected‘的自定义按钮。在skin类中,您希望为属性“selected”添加一个get和set函数,以便在设置皮肤时对其执行某些操作。如何告诉皮肤类这是您可以在主机组件中使用的可用属性?
发布于 2011-09-03 02:06:28
这个问题存在于一个非常理论的层面。我不清楚您想要实现什么,也不清楚您在组件类上设置了什么类型的属性。我怀疑,如果你有20个属性,并且每个属性都需要以某种方式与不同的皮肤状态相关联,那么就会出现架构问题。
但是,我可以尝试回答您的具体问题。
是否有任何方法直接从
主机组件类,所以当你定义你的皮肤类时,它是可以直接读取的吗?
在构建Flex时,他们建议创建一个名为hostComponent的属性,该属性为MobileSkins类提供了对组件类的引用。MXML皮肤已经有了一个similar property。如果您使用的是自定义外观,则会使用HostComponent
元数据自动创建此属性。因此,在皮肤类中,您可以使用hostComponent属性访问component类的属性。
假设您有一个布尔属性为'selected‘的自定义按钮。在skin类中,您希望为属性“selected”添加一个get和set函数,以便在设置皮肤时对其执行某些操作。
我不会想象你会想要这样做的情况。通常,您不会在要在skin类的实例上显式更改的skin类上定义任何属性。
您可以在属性更改时从component类中分派一个事件。这是很常见的。然后使用hostComponent属性在皮肤类中侦听该事件,并在那里进行更改。
还有一种方法可以从component类中访问皮肤类实例。因此,您可以使用skin属性直接在皮肤类上更改属性。
如果没有仔细考虑,我不会采用这两种方法中的任何一种。理想情况下,组件类和皮肤类应该相互封装;并且每个方法都将提供依赖项。
发布于 2011-09-05 14:35:28
当您影响组件的外观时,可以使用元标记来存储对实际使用的外观部分的引用:
[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);
}
此外,由于您已经存储了对皮肤部分的引用,因此您仍然可以随时在宿主组件中访问它并更新它。我说得够清楚了吗?:-)
https://stackoverflow.com/questions/7287280
复制相似问题