【问题标题】:Flex mobile skin overriding hostComponent of parent skin?Flex移动皮肤覆盖父皮肤的hostComponent?
【发布时间】:2012-02-10 05:24:42
【问题描述】:

?问题很简单,我扩展Button 来创建ImageButton,我扩展ButtonSkin 来创建ImageButtonSkin。但是,当我这样定义 hostComponent 时:

public var hostComponent:ImageButton

我收到一个错误,提示与 ButtonSkinBase 中的 hostComponent:ButtonBase 存在冲突。

如何扩展皮肤并为其提供新的 hostComponent?

【问题讨论】:

  • 我不认为你可以。此外,为什么要创建 ImageButton? Spark 按钮有一个“图标”样式来给它一个图像。
  • 哇,太好了(不是)。所以,你可以扩展皮肤,但你只能将它用于父皮肤指定的组件,太棒了。 ImageButton 因为我希望整个图标都具有图像背景,而不仅仅是图标。它通常甚至没有文字。
  • 啊哈,在这种情况下,我会将其设为自定义按钮的样式,而不是属性。这样您就可以通过getStyle() 方法在您的皮肤中访问它,而不必覆盖hostComponent
  • 如何让它成为一种风格?抱歉可能是一个显而易见的问题,但我只知道 setStyle() 方法,您需要在父视图初始化后调用它,这在过程中发生得太晚了,在皮肤类中的样式初始化之后。
  • 在您的 Button 类中使用 [Style(name="backgroundImage")] 元数据。然后,当您开始输入 MXML 时,FlashBuilder 也会建议它,并且编译器将接受 MXML 属性。

标签: apache-flex flex4 skinning flex-mobile


【解决方案1】:

如何扩展皮肤并为其提供新的 hostComponent?

为什么必须这样做? hostComponent 是一个 ButtonBase,它是您的 ImageButton 扩展的东西。为什么需要更改 hostComponent 的类型?如果您需要将 hostComponent 作为 ImageButton 访问,则可以强制转换它:

var myImageButton : ImageButton = hostComponent as ImageButton;

在这个问题的cmets中,你说:

所以,你可以扩展皮肤,但你只能 将它用于父皮肤指定的组件,太棒了。

这根本不应该是真的。您说自己的 hostComponent 具有 ButtonBase 类型,但您正在扩展 ButtonSkin。根据您的说法,您将无法在 Button 组件上使用 ButtonSkin,只能在 ButtonBase 组件上使用。这不是真的。

我还将为@RIAstar 关于元数据的评论添加一项说明。元数据仅用于编译器的代码提示和 MXML 参数检查。您可以轻松地创建一个没有这些的样式。您只需使用 setStyle 方法设置值:

myHostComponent.setStyle('myImageColor',0x000000);

你可以像这样在皮肤中使用它:

this.getStyle('myImageColor');

我认为——但我不确定——即使未声明元数据,您也可以通过 CSS 设置样式。使用 Spark 组件生命周期,完全可以在组件初始化其样式之前设置样式。

【讨论】:

  • 啊,问题是我很早就访问了hostComponent。我应该在 getBorderClassForCurrentState() 中进行。至于样式,因为我无论如何都需要子类按钮,我认为做属性比样式更有意义,我不知道,有些东西告诉我阅读和解析样式可能会更昂贵。
猜你喜欢
  • 2011-11-12
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多