Flex 3: переопределить редактируемый список keyDownHandler дает фокус проблемы - PullRequest
1 голос
/ 05 августа 2011

Я пытаюсь переопределить обработку по умолчанию клавиш «вверх» и «вниз» для редактируемого списка, так что при нажатии редактируемая запись списка ведет себя так, как если бы была нажата управляющая клавиша,но «строка выбранного элемента» перемещается вверх или вниз.

Вот мой (упрощенный) компонент:

<?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>    

По некоторым причинам это не работает:если строка редактируется, первое нажатие клавиши «вверх» (или вниз) завершает редактирование и перемещает панель.Дальнейшее нажатие клавиш вверх или вниз не имеет никакого эффекта, но если вы щелкнете где-нибудь рядом со списком, оно начнет работать.Это заставляет меня думать, что это главный вопрос.Как ни странно, если вы нажмете escape, редактирование закончится, и вы сможете правильно перемещаться вверх и вниз.

Если строка callLater не закомментирована, чтобы попытаться удержать фокус в списке, панель первоначально перемещается в направлениинажмите, но затем снова вернитесь и отредактируете исходную строку!

У кого-нибудь есть идеи?

Заранее спасибо,

Майк

Ответы [ 2 ]

0 голосов
/ 09 августа 2011

Вам придется расширить список, чтобы переопределить унаследованное поведение при нажатии клавиш.Тем не менее, я заставил его работать в течение первого UP или DOWN после нажатия на строку, но я не могу продолжать последующие события нажатия клавиш:

<?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>

0 голосов
/ 05 августа 2011

Я пытался проследить за источником, и единственная «причина», указанная для вызова endEdit (), всегда ListEventReason.CANCELLED («отменено»), что может быть вашей проблемой.

Причина, по которой это по-прежнему будет работать с клавишей escape, заключается в том, что она обрабатывается функцией editorKeyDownHandler () List, которая является закрытой (нет-нет, вы не можете переопределить меня).

...