你无法阻止它,但你可以扭转它。为此,您可以向同一事件(KeyboardEvent.DOWN)添加具有不同优先级的处理程序。一个将在 TextField 之前执行,并保存选择索引,另一个将在之后执行并恢复它们。工作代码如下:
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import mx.controls.TextInput;
import mx.events.FlexEvent;
public class FooledTextInput extends TextInput
{
private var ssi : int = 0;
private var sei : int = 0;
public function FooledTextInput()
{
super();
this.addEventListener(KeyboardEvent.KEY_DOWN, onBeforeKeyDown, false, 10000);
this.addEventListener(KeyboardEvent.KEY_DOWN, onAfterKeyDown, false, -10000);
}
private function onBeforeKeyDown(e : KeyboardEvent) : void
{
if (e.keyCode == Keyboard.UP || e.keyCode == Keyboard.DOWN)
{
ssi = this.selectionBeginIndex;
sei = this.selectionEndIndex;
}
}
private function onAfterKeyDown(e : KeyboardEvent) : void
{
if (e.keyCode == Keyboard.UP || e.keyCode == Keyboard.DOWN)
{
this.setSelection(ssi, sei);
}
}
}
您可能想要 ssi(选择开始索引)和 sei(选择结束索引)更好的名称,我懒得找到一些。
我认为这个解决方案是基于 Alex Harui 的一篇文章,我不太记得了,但他的博客上有很多与 Flex 相关的好东西。
UPDATE:对于spark TextInput,预防不仅是可能的,而且非常容易。您需要做的就是在捕获阶段捕获事件并停止传播。代码:
package
{
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import spark.components.TextInput;
public class HackedTextInput extends TextInput
{
public function HackedTextInput()
{
super();
addEventListener(KeyboardEvent.KEY_DOWN, onBeforeKeyDown, true);
}
private function onBeforeKeyDown(e:KeyboardEvent) : void
{
if (e.keyCode == Keyboard.UP || e.keyCode == Keyboard.DOWN)
{
e.stopImmediatePropagation();
}
}
}
}
请注意 addEventListener 调用中的最后一个参数,该参数设置为 true 以便在捕获阶段调用处理程序。遗憾的是,这一解决方案不适用于 mx TextInput,仅适用于 Spark。