我正在尝试覆盖可编辑列表的“向上”和“向下”键的默认处理,这样当按下它们时,正在编辑的列表条目就像按下了转义键一样,但是“选定的项目栏”向上或向下移动。
这是我的(简化)组件:
<?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'行以尝试使列表保持焦点,则该栏最初会向按键方向移动,然后再次向后移动并重新编辑原始行!
有人有任何想法吗?
提前致谢,
麦克
答案 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>