我有一个名为ButtonPanel
的自定义组件,用ActionScript编写。基本上它只是一个面板,在mx:ButtonBar
标题栏的右上方显示mx:Panel
,并响应栏中按钮的点击次数。
ButtonBar有三种可用于按钮的样式:buttonStyleName
,firstButtonStyleName
和lastButtonStyleName
。我想为ButtonPanel
编写这些样式,以便如果它被声明为:
<comp:ButtonPanel buttonStyleName="myButtonStyle" ... />
然后ButtonPanel
将传递样式并设置ButtonBar
的相应样式。
我真的不知道从哪里开始,因为我从来没有搞过定义样式。有人可以帮忙吗?
答案 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;
如果这两行代码没有完全解释给你,请告诉我,我可以充实我的榜样。