【问题标题】:Change contentBackgroundColor of List with itemRenderer使用 itemRenderer 更改 List 的 contentBackgroundColor
【发布时间】:2011-02-11 14:03:10
【问题描述】:

嘿,我正在尝试根据 dataprovider 中找到的内容更改 List 组件的 contentBackgroundColor。例如:

<s:ItemRenderer name="ir"
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    autoDrawBackground="true"
    contentBackgroundColor="{(data.location == 'home')?0x000000:0x666666}">

不幸的是,这似乎被忽略了,因为列表只显示了默认的白色背景。任何人都可以提出解决方案吗?

【问题讨论】:

    标签: apache-flex list flex4 flash-builder itemrenderer


    【解决方案1】:

    我会覆盖 set data setter 方法并在那里设置样式,因为您可以保证捕捉到对数据的每一次更改:

    override public function set data(value:Object):void {
        super.data = value;
        this.setStyle("contentBackgroundColor", value.location == "home" ? 0x000000 : 0x666666);
    }
    

    【讨论】:

    • 好电话,但仍然被忽略。如果我在 itemrenderer 设置数据方法中跟踪(value.location),它会跟踪更多次,然后我的 xml 中有位置元素。实际上是 + 1 的两倍。非常奇怪的行为......
    • 嗯,如果将 autoDrawBackground 设置为 false 会发生什么?另外,另一种方法是将其设置为 false 并将 Rect 添加到项目渲染器的背景中,然后根据需要设置填充颜色。
    • 如果 autoDrawBackground = false,保持背景为白色,但项目突出显示现在已关闭。我将尝试 Rect 解决方案,在 adobe 帮助页面上也看到了。
    • 添加 不起作用。
    • 你需要给它尺寸。宽度/高度 100% 或左、右、上、下 = 0。
    【解决方案2】:

    ItemRenderer 从不尊重 contentBackgroundColor 的 Group 扩展而来,而是将其作为继承样式传递给其元素。

    所以 contentBackgroundColor 确实有效,但不是您所期望的那样,如果您将一个确实尊重 contentBackgroundColor 的组件放入您的渲染器中,那么它将获得该颜色,例如:

    <s:List>
        <s:dataProvider>
            <s:ArrayList>
                <fx:String>0</fx:String>
            </s:ArrayList>
        </s:dataProvider>
        <s:itemRenderer>
            <fx:Component>
                <s:ItemRenderer contentBackgroundColor="red">
                    <s:VGroup paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10">
                        <s:Label text="ItemRenderer {data}" />
                        <s:ComboBox />
                    </s:VGroup>
                </s:ItemRenderer>
            </fx:Component>
        </s:itemRenderer>
    </s:List>
    

    如前所述,您最好覆盖数据设置器并从那里更改背景 Rect 的颜色,例如:

    <s:List>
        <s:dataProvider>
            <s:ArrayList>
                <fx:String>0</fx:String>
                <fx:String>1</fx:String>
            </s:ArrayList>
        </s:dataProvider>
        <s:itemRenderer>
            <fx:Component>
                <s:ItemRenderer>
                    <fx:Script>
                        <![CDATA[
                            override public function set data(value:Object):void {
                                super.data = value;
                                if (data == null)
                                    return;
    
                                if (data == 1){
                                    c.color = 0xEEEEEE;
                                } else {
                                    c.color = 0x666666;   
                                }
                            }
                        ]]>
                    </fx:Script>
                    <s:Rect width="100%" height="100%">
                        <s:fill>
                            <s:SolidColor id="c" />
                        </s:fill>
                    </s:Rect>
                    <s:Label text="ItemRenderer {data}" />
                </s:ItemRenderer>
            </fx:Component>
        </s:itemRenderer>
    </s:List>
    

    【讨论】:

    • 如果您的 itemRenderer 是外部的并且您在一个水平布局中有多个标签怎么办。例如:&lt;s:layout&gt; &lt;s:HorizontalLayout gap="0" variableColumnWidth="true" paddingBottom="14" paddingLeft="0" paddingTop="14" horizontalAlign="center" /&gt; &lt;/s:layout&gt; &lt;s:Rect width="100%" height="100%"&gt; &lt;s:fill&gt; &lt;s:SolidColor id="c" /&gt; &lt;/s:fill&gt; &lt;/s:Rect&gt; &lt;s:Label id="locationLbl" width="60" /&gt; &lt;s:Label id="opponentLbl" width="90" /&gt; &lt;s:Label id="timeLbl" width="60"/&gt; &lt;s:Label id="dateLbl" width="60" /&gt;
    • 这很难解释。如果我将上面的代码应用于我的外部 itemRenderer,它会在第一个标签开始之前呈现一个彩色框。如果 if 条件中的条件为真,它会将彩色框呈现为某种颜色。然而,当我滚动我的列表时,它的行为很奇怪,并且以随机的方式呈现其他颜色的框。我希望这是有道理的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多