Flex 3:覆盖可编辑列表的keyDownHandler会产生焦点问题

时间:2011-08-05 15:21:52

标签: flex list override handler keydown

我正在尝试覆盖可编辑列表的“向上”和“向下”键的默认处理,这样当按下它们时,正在编辑的列表条目就像按下了转义键一样,但是“选定的项目栏”向上或向下移动。

这是我的(简化)组件:

<?xml version="1.0" encoding="utf-8"?>
<mx:List  xmlns:mx="http://www.adobe.com/2006/mxml"
    enabled="true" width="100%" height="100%"
    creationComplete="initialise()"
    editable="true" 
>
<mx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;

        private function initialise():void
        {
            dataProvider = new ArrayCollection(["this", "is", "a", "very", "simple", "example"]);
        }

        override protected function keyDownHandler(event:KeyboardEvent):void
        {
            if (event.keyCode == Keyboard.ESCAPE 
                || event.keyCode == Keyboard.DOWN 
                || event.keyCode == Keyboard.UP)
                    endEdit("ENDEDIT"); // Same behaviour with destroyItemEditor();

            super.keyDownHandler(event);
            //callLater(this.setFocus);
        }
    ]]>
</mx:Script>    

由于某些原因,这不起作用:如果正在编辑行,则第一个“向上”(或向下)按键结束编辑并移动条。进一步向上或向下按键无效,但是如果单击列表附近的某个位置,它就会开始工作。这让我觉得这是一个焦点问题。奇怪的是,如果你点击逃脱,编辑就会完成,你可以正确地上下移动。

如果取消注释'callLater'行以尝试使列表保持焦点,则该栏最初会向按键方向移动,然后再次向后移动并重新编辑原始行!

有人有任何想法吗?

提前致谢,

麦克

2 个答案:

答案 0 :(得分:0)

我一直在尝试关注源代码,并且为endEdit()调用提供的唯一“原因”始终是ListEventReason.CANCELLED(“cancelled”),这可能是您的问题。

这仍然适用于转义键的原因是它由List的editorKeyDownHandler()函数处理,这是私有的(不,你不能覆盖我)。

答案 1 :(得分:0)

您将不得不扩展List以覆盖继承的keydown行为。但是,我在点击一行后让它在第一个UP或DOWN工作,但我似乎无法继续后续的keydown事件:

<?xml version="1.0" encoding="utf-8"?>
<mx:List xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="{creationCompleteHandler()}">
<mx:Script>
    <![CDATA[   
        override protected function keyDownHandler(event:KeyboardEvent):void
        {       
            if (itemEditorInstance)
            {
                destroyItemEditor();

                if (event.keyCode == Keyboard.UP)
                {
                    if (selectedIndex == 0)
                    {
                        selectedIndex = this.dataProvider.length - 1;
                    }
                    else
                    {
                        selectedIndex--;
                    }
                }
                else if (event.keyCode == Keyboard.DOWN)
                {
                    if (selectedIndex == this.dataProvider.length - 1)
                    {
                        selectedIndex = 0;
                    }
                    else
                    {
                        selectedIndex++;
                    }
                }

            }
            super.keyDownHandler(event);
        }           
    ]]>
</mx:Script>