1

我在围绕与其主机组件有关的spark皮肤类中缠绕我的头时遇到问题。基本上,从我所见过的大多数Flex 4框架中的每个皮肤都看不到在主机组件中动态设置的属性。相反,他们定义暴露于外观类的状态,以定义组件外观的不同。当你有一个非常简单的组件和一组标准的状态时,这是非常好的,而且当你有20个不同的属性(假设)设置在你的主机组件中,应该改变皮肤的外观时,它可能非常快速地变得非常复杂。将属性暴露给Spark皮肤类

我已经看到他们用来解决这个问题的方式是通过覆盖commit属性和无效的外观类中的函数,从那里获取他们想要的属性的值,然后将它们设置为本地实例化皮肤类中的变量。这很好,但我觉得这只是一个补丁解决方法,它使事情变得比需要的复杂得多。

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

回答

5

这个问题存在于一个非常理论的层面。我不清楚你想要完成什么,也不知道你在组件类上设置了什么样的属性。我怀疑,如果您有20个属性,并且每个属性都需要以某种方式关联到不同的皮肤状态,那么就存在体系结构问题。

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

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

主机组件类,所以当你定义你的皮肤类是直接 准备从读?

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

比方说你有一个自定义按钮,其布尔属性为 'selected'。在皮肤类中,您想添加一个get,并为属性'selected'设置 函数,这样您就可以在皮肤设置时对皮肤执行一些动作 。

我不打算想要这样做的情况。一般来说,您不会在您希望在外观类的实例上明确更改的外观类上定义任何属性。

当属性更改时,您可以从组件类派发事件。 [这很常见]。然后使用hostComponent属性在外观类中侦听该事件,并在那里更改事件。

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

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

+0

谢谢你试图解决这个模糊的问题!哈哈......虽然通过提及HostComponent元数据标签来敲击头部......基本上我试图做的是从主机组件访问属性并根据它的值在皮肤上执行操作... I在我的MXML中添加了hostcomponent标签,但是我错误地认为元数据主机组件标签会直接将我的主机组件的属性公开给皮肤......它没有点击它只给出一个-reference-它被调用'主机组件',将公开我想要的属性 –

+0

顺便说一句,你完成这项任务的其他过程也是非常好的想法以及我知道的,但它不是点击,那就是如何实现这些过程 –

0

当你影响皮肤的成分,你可以使用元标签的参考存储你实际使用的皮肤部分:

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

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

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); 
} 

此外,由于已存储的参考,你的皮肤部位,你仍然可以访问它,只要你在你的主机组件要和更新。我清楚了吗? :-)

+0

谢谢你添加这个信息,这绝对有帮助!然而,Flextras.com正是以我需要的方式将它击中头部,尽管如此我必须给他答案 –