【问题标题】:How to create a custom Flex 4 button with 3 labels如何创建具有 3 个标签的自定义 Flex 4 按钮
【发布时间】:2011-03-15 13:33:43
【问题描述】:

我想创建一个带有三个标签的自定义按钮组件:左对齐、居中对齐和右对齐。我不能只使用标签对齐属性,因为我想同时使用所有 3 个标签。

我对创建自定义组件很熟悉,但我以前从未尝试过构建这样的组件...

这是我目前所拥有的:

<?xml version="1.0" encoding="utf-8"?>
<s:Button 
    xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flex/spark">

    <fx:Script>
        <![CDATA[

            private var labelContentL:String;
            private var labelContentC:String;
            private var labelContentR:String;

            public function set labelL(value:String):void
            {
                labelContentL = value;
            }
            public function set labelC(value:String):void
            {
                labelContentC = value;
            }
            public function set labelR(value:String):void
            {
                labelContentR = value;
            }

            public function get labelL():String
            {
                return labelContentL;
            }
            public function get labelC():String
            {
                return labelContentC;
            }
            public function get labelR():String
            {
                return labelContentR;
            }

        ]]>
    </fx:Script>

    <s:Label id="l" width="100%" text="{labelContentL}" textAlign="left" paddingLeft="10" />
    <s:Label id="c" width="100%" text="{labelContentC}" textAlign="center" />
    <s:Label id="r" width="100%" text="{labelContentR}" textAlign="right" paddingRight="10" />

</s:Button>

按钮创建后标签不会改变,所以我不担心缺少[Bindable] 元数据。

我现在卡住了,出现以下编译器错误:

“String”类型的默认属性“label”的多个初始值设定项。

...对于 3 个&lt;s:Label&gt; 行中的每一行。

基于this answer 的类似问题,我尝试将label="" 添加到我的&lt;s:Button&gt; 声明中,但这只会增加另一个错误。

我该如何解决这个问题?

【问题讨论】:

  • 我认为 Button 组件只会接受标签的单个实例,因此会出现错误。我想知道您打算如何使用带有 3 个标签的按钮,这些标签分别以 L、C 和 R 对齐。
  • @Angelo 我只使用一个按钮,因为它是最简单的组件,看起来与我想要的很接近,并且提供了我需要的功能(点击处理)而没有太多额外的绒毛。这是设计规范的屏幕截图,展示了如何使用它:skit.ch/be4r

标签: apache-flex flex4


【解决方案1】:

你的问题是按钮标签下的标签标签不是标签类型的项目,它是按钮上使用的标签,并且是字符串类型。

为什么不把它作为一个皮肤,而不是一个自定义组件呢?

<?xml version="1.0" encoding="utf-8"?>
<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx">
<!-- host component -->
<fx:Metadata>
    [HostComponent("ThreeLabelButton")]
</fx:Metadata>

<!-- states -->
<s:states>
    <s:State name="disabled" />
    <s:State name="down" />
    <s:State name="over" />
    <s:State name="up" />
</s:states>

<s:Rect bottomLeftRadiusX="5" 
        bottomRightRadiusX="5" 
        topLeftRadiusX="5" 
        topRightRadiusX="5" 
        top="0" left="0" right="0" bottom="0">
    <s:fill>
        <s:SolidColor color.up="#CCCCCC" color.over="#555555" color.down="#888888" />
    </s:fill>
</s:Rect>
<mx:Label id="leftLabel" text="{hostComponent.leftText}" left="0" />
<mx:Label id="rightLabel" text="{hostComponent.rightText}" right="0" />
<mx:Label id="centerLabel" text="{hostComponent.centerText}" left="{(this.width - centerLabel.width) / 2}" /> 
</s:Skin>

这将适用于此类:

import mx.controls.Label;

import spark.components.supportClasses.ButtonBase;

public class ThreeLabelButtonComponent extends ButtonBase
{
    public function ThreeLabelButtonComponent()
    {
        super();
    }

    [SkinPart]
    public var leftLabel:Label;

    [SkinPart]
    public var rightLabel:Label;

    [SkinPart]
    public var centerLabel:Label;

            [Bindable]
    public var leftText:String;
            [Bindable]
    public var rightText:String;
            [Bindable]
    public var centerText:String;


    protected override function partAdded(partName:String, instance:Object):void
    {
        super.partAdded(partName, instance);
        if(instance === leftLabel)
        {
            leftLabel.text = leftText;  
        }
        if(instance === rightLabel)
        {
            rightLabel.text = rightText;    
        }
        if(instance === centerLabel)
        {
            centerLabel.text = centerText;  
        }
    }
}

【讨论】:

  • 您还需要子类化按钮来添加@SkinPart 元素,这样皮肤就有了实际文本显示的来源。此外,您应该将所有三个标签都放在 HBox 或类似内容中。
  • 我不介意用皮肤做它——我已经在做皮肤了,但是按钮被用作列表组件的 ItemRenderer,所以值必须是可以设置到按钮上,阿拉:&lt;s:Button skinClass="..." labelLeft="Left-text" labelRight="Right-text" /&gt;。您的示例使用静态文本。你能展示我如何在 ItemRenderer 中动态获取值吗?
  • @Adam Tuttle 我将 ButtonBase 子类化并为标签添加了皮肤部件。看看这是否能解决您的问题。
  • 我想我部分在那里。除了更新到 Spark 标签之外,我认为我没有太大变化。这是我到目前为止所得到的;但标签是空白的......从the main file开始,然后使用item renderer,它使用custom classskin。还包括列表皮肤。
  • 当我说“标签为空白”时,我的意思是没有显示任何文本。我什至尝试在一些地方硬编码它们的值以“测试”,但它从未出现过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多