在Flex列表/数据网格中设置前景和背景选择颜色的样式

时间:2010-10-15 02:31:39

标签: flex flex4

Flex公开了一个“selectionColor”CSS属性,用于样式化所选列表/数据网格的背景颜色。但是,我无法弄清楚如何设置所选列表的前景或文本颜色的样式。看起来您只能更改所有行的前景色。

因此,例如,我想要一个非常暗的选择背景颜色和一个非常轻的取消选择的背景颜色。您同样希望选择浅色文本颜色,并取消选择深色文本颜色。

我知道我可以使用自定义项目渲染器执行此操作,但这看起来相当愚蠢。关键是在我的应用程序中设置所有列表/数据网格的样式。我不想为我使用它的每个地方设置自定义项呈示器或扩展Datagrid。请注意,我正在使用Flex 4并且我愿意使用皮肤,但我不知道这是否意味着任何考虑到DataGrid尚未被激发的东西。

3 个答案:

答案 0 :(得分:3)

Flex 3使用了textRollOverColortextSelectedColor,但Flex 4组件不再支持它们了。

以下示例演示了所有这些+为spark list添加对此颜色的支持:

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx">

    <fx:Style>
        @namespace s "library://ns.adobe.com/flex/spark";
        @namespace mx "library://ns.adobe.com/flex/mx";

        global
        {
            textRollOverColor: yellow;
            textSelectedColor: green;
        }

    </fx:Style>

    <fx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;

        private function getListDataProvider():ArrayCollection
        {
            return new ArrayCollection([ "Item 1", "Item 2", "Item 3"]);
        }

        private function getGridDataProvider():ArrayCollection
        {
            return new ArrayCollection([ { name: "Item 1" }, { name: "Item 2" }, { name: "Item 3" } ]);
        }

    ]]>
    </fx:Script>

    <s:layout>
        <s:VerticalLayout horizontalAlign="center" verticalAlign="middle"/>
    </s:layout>

    <s:List dataProvider="{getListDataProvider()}"/>

    <s:List dataProvider="{getListDataProvider()}" itemRenderer="ColoredItemRenderer"/>

    <mx:List dataProvider="{getListDataProvider()}"/>

    <mx:DataGrid dataProvider="{getGridDataProvider()}"/>

</s:Application>

ColoredItemRenderer

<s:ItemRenderer 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">

    <fx:Script>
    <![CDATA[

        override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
        {
            super.updateDisplayList(unscaledWidth, unscaledHeight);

            var color:uint;
            if (selected)
                color = getStyle("textSelectedColor");
            else if (hovered)
                color = getStyle("textRollOverColor");
            else
                color = getStyle("color");
            sparkLabel.setStyle("color", color);
        }

    ]]>
    </fx:Script>

    <s:Label id="sparkLabel" text="{data}"/>

</s:ItemRenderer>

答案 1 :(得分:2)

以下是使用states和itemRenders

在Flex 4中如何执行此操作的示例
<s:List itemRenderer="com.renderer.GlossaryRenderer" change="handleGridClick(event)" width="293" height="206" styleName="glossaryList" dataProvider="{_glossary}">
    <s:layout>
        <s:VerticalLayout horizontalAlign="justify" paddingLeft="5" requestedRowCount="9" />
    </s:layout>
</s:List>

您可以像这样设置项目渲染器

<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer 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="false">
<s:states>
    <s:State name="normal" />
    <s:State name="hovered" />
    <s:State name="selected" />
</s:states>
<s:Label id="sparkLabel" backgroundColor.selected="#ff0000" color.selected="#FFFFFF" color.hovered="#FFFFFF" text="{data.word}" left="2" right="2" top="4" bottom="4" />
</s:ItemRenderer>

答案 2 :(得分:1)

对于Spark DataGrid,您需要基于GridItemRenderer创建一个新的项呈示器。然后将其分配给DataGrid itemRenderer属性。

MyGridItemRender.mxml:

<s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
            xmlns:s="library://ns.adobe.com/flex/spark"  
            width="100%"
            height="100%">

    <fx:Script>
        <![CDATA[

            override public function prepare(hasBeenRecycled:Boolean):void {
                super.prepare(hasBeenRecycled);

                var styleClient:IStyleClient = owner as IStyleClient;
                var color:uint;

                if (selected && styleClient.getStyle("textSelectionColor")!==undefined) {
                    color = styleClient.getStyle("textSelectionColor");
                }
                else if (selected && styleClient.getStyle("textSelectedColor")!==undefined) {
                    color = styleClient.getStyle("textSelectedColor");
                }
                else if (hovered && styleClient.getStyle("textRollOverColor")!==undefined) {
                    color = styleClient.getStyle("textRollOverColor");
                }
                else {
                    color = styleClient.getStyle("color");
                }

                labelDisplay.setStyle("color", color);
            }

        ]]>
    </fx:Script>

    <s:Label id="labelDisplay" 
             paddingLeft="3" paddingRight="3" 
             paddingTop="5" paddingBottom="5"
             verticalCenter="2"
             left="2"/>

</s:GridItemRenderer>

代码:

<s:DataGrid id="dataGrid" itemRenderer="MyGridItemRenderer"/>

您也可以使用此DataGrid,默认情况下启用它。