1

我无法围绕与它的主机组件相关的火花皮肤类。基本上,从我所看到的 Flex 4 框架中的大多数皮肤来看,它们并不直接公开在宿主组件中动态设置的属性。相反,它们定义了暴露给皮肤类的状态,以定义组件何时应该看起来不同。当你有一个非常简单的组件和一组标准状态时,这一切都很好而且很花哨,但是当你在你的主机组件中设置 20 个不同的属性(假设)来改变皮肤的外观时,它可能会很快变得非常复杂.

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

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

4

2 回答 2

5

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

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

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

宿主组件类,所以当你定义你的皮肤类时,它就可以直接读取了吗?

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

假设您有一个布尔属性为“已选择”的自定义按钮。在皮肤类中,您希望为属性“selected”添加一个获取和设置函数,以便您可以在设置皮肤时对皮肤执行一些操作。

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

当属性更改时,您可以从组件类中分派一个事件。[这很常见]。然后使用 hostComponent 属性在皮肤类中侦听该事件并在那里进行更改。

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

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

于 2011-09-02T18:06:28.340 回答
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);
}

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

于 2011-09-05T06:35:28.413 回答