Search code examples
apache-flexflex-spark

How to remove the caret indicator on Spark DataGrid


I couldn't find a simple way to get remove or hide the caretIndicator in the Spark DataGrid so I'm posting the solution here if there's not a better way.


Solution

  • This seems to work. To hide the caretIndiator we have to create a new data grid skin based on spark.skins.spark.DataGridSkin. Then in that skin set the alpha of the stroke or alpha of the rect to 0.

    Method 1:

    MXML:

    <s:DataGrid skinClass="view.skins.AbstractDataGridSkin"/>
    

    AbstractDataGridSkin:

    <?xml version="1.0" encoding="utf-8"?>
    <spark:DataGridSkin 
        xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:mx="library://ns.adobe.com/flex/mx"
        xmlns:fb="http://ns.adobe.com/flashbuilder/2009"
        xmlns:spark="spark.skins.spark.*" 
        xmlns:skins="view.skins.*"
        >
        <fx:Component id="caretIndicator">
            <s:Rect implements="spark.components.gridClasses.IGridVisualElement" alpha="0">
                <fx:Script>
                    <![CDATA[
                        import spark.components.DataGrid;
                        import spark.components.Grid;
    
                        /**
                         * @private
                         */
                        public function prepareGridVisualElement(grid:Grid, rowIndex:int, columnIndex:int):void
                        {
    
                            const dataGrid:DataGrid = grid.dataGrid;
                            if (!dataGrid)
                                return;
    
                            const color:uint = dataGrid.getStyle("caretColor");
                            caretIndicatorFill.color = color;
                        }
                    ]]>
                </fx:Script>
    
                <s:stroke>
                    <!--- @private -->
                    <s:SolidColorStroke id="caretIndicatorFill" color="0x0167FF" weight="0" alpha="0"/>
                </s:stroke>
            </s:Rect>
        </fx:Component>
    </spark:DataGridSkin>
    

    Method 2:

    There's another method that involves duplicating the default datagrid skin and removing the caretIndicator property. That ways probably better : P.

    Method 3:

    This also works:

    <spark:DataGridSkin 
        xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:mx="library://ns.adobe.com/flex/mx"
        xmlns:fb="http://ns.adobe.com/flashbuilder/2009"
        xmlns:spark="spark.skins.spark.*" 
        xmlns:skins="view.skins.*"
        initialize="caretIndicator = null" />