在Actionscript中定义“传递”样式

时间:2012-03-23 15:21:31

标签: actionscript-3 flex styles definition custom-component

我有一个名为ButtonPanel的自定义组件,用ActionScript编写。基本上它只是一个面板,在mx:ButtonBar标题栏的右上方显示mx:Panel,并响应栏中按钮的点击次数。

ButtonBar有三种可用于按钮的样式:buttonStyleNamefirstButtonStyleNamelastButtonStyleName。我想为ButtonPanel编写这些样式,以便如果它被声明为:

<comp:ButtonPanel buttonStyleName="myButtonStyle" ... />

然后ButtonPanel将传递样式并设置ButtonBar的相应样式。

我真的不知道从哪里开始,因为我从来没有搞过定义样式。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:4)

您所称的“传递”样式实际上称为继承样式。问题的解决方案实际上非常简单。

您使用自定义组件上的style metadata声明ButtonPanel具有名为“buttonStyleName”的样式名:

[Style(name="buttonStyleName", inherit="yes")]

public class ButtonPanel extends Panel {
     ....
}

请注意设置为true的'inherit'标志:这将确保自定义Panel中具有相同样式的任何组件将继承您在Panel级别为该样式指定的值。

设置此元数据将确保FlashBuilder会将buttonStyleName建议为样式而不是属性(就像Sam的解决方案一样)。


修改:已定义的样式

我一开始并没有意识到你指的是mx ButtonBar(因为没有明确提到)。这不适合你的原因是mx:ButtonBar已经将这些样式定义为不继承。看一下源代码:

[Style(name="firstButtonStyleName", type="String", inherit="no")]
[Style(name="buttonStyleName", type="String", inherit="no")]
[Style(name="lastButtonStyleName", type="String", inherit="no")]

因此,当您尝试在自定义面板中覆盖该定义时,编译器会抱怨,因为它根本不知道要选择哪个相互矛盾的指令。如果你想坚持使用mx:ButtonBar,我们将不得不做更多的工作。

首先在ButtonPanel上定义样式,就像它们在mx:ButtonBar中定义的那样,它们具有相同的签名(您只需复制/粘贴上面的三行)。这将关闭编译器,但样式将不再继承,对吧?

因此我们必须手动传递它们:在自定义Panel外观中,覆盖updateDisplayList()方法,并且 - 假设ButtonBar的id为'buttonBar' - 添加以下内容:

    private const buttonStyles:Array = [
        "firstButtonStyleName",
        "buttonStyleName",
        "lastButtonStyleName"
    ];

    override protected function updateDisplayList(unscaledWidth:Number, 
                                                  unscaledHeight:Number):void 
    {
        if (buttonBar) 
            for each (var buttonStyle:String in buttonStyles)
                buttonBar.setStyle(buttonStyle, getStyle(buttonStyle));

        //some other code

        super.updateDisplayList(unscaledWidth, unscaledHeight);
    }

这将从主机Panel获取样式并将它们传递给ButtonBar。

答案 1 :(得分:0)

为了传递这些样式,您只需将它们存储为字符串变量,然后将它们传递给内部ButtonBar。

<mx:ButtonBar ... buttonStyleName="{buttonStyleName}" ... />

[Bindable]public var buttonStyleName:String;

如果这两行代码没有完全解释给你,请告诉我,我可以充实我的榜样。