Adobe Flex3:视图可见时的键盘快捷键?

时间:2009-12-10 13:59:01

标签: flex actionscript-3

我有一个非常大的Flex应用程序,其中有大量的视图,我想要添加快捷方式的视图。

我正在寻找类似的东西:

<mx:Vbox>

<foo:Shortcut keys="ctrl+s" action="{bar();}"/> 

....

</mx:VBox>

是否有任何框架或组件已经完成了这样的事情?我想构建它应该太难了?在构建这个时,我只希望在视图可见时激活快捷方式。我怎么检测到这个?使用非可视组件时,哪种基类最好继承?

3 个答案:

答案 0 :(得分:2)

我不知道任何框架组件已经这样做了,但是如果您尝试构建自己的示例,上面的示例应该可以帮助您。

没有必要继承任何组件以获取非可视组件,例如您在此处描述的组件(您的“foo”类不需要父项。)Flex框架中没有任何内容需要您继承。

然而,您构建它,您的foo类将必须接收并解析键盘代码以侦听并接受一个或多个方法来调用。您所要做的就是找出何时添加和删除将调用传入方法的事件侦听器。

要根据可见性处理打开和关闭键盘事件,只需将foo组件绑定到其父级的“visible”属性,然后相应地添加/删除事件侦听器。

当foo嵌套的组件在显示列表上的而不仅仅是可见时,您可能还会考虑添加侦听器。为此,只需在其中一个组件生命周期方法中添加和删除事件侦听器 - 可能commitProperties是最合适的。

答案 1 :(得分:1)

我不认为这个解决方案直接回答你的问题,但无论如何,为了帮助解决你的问题,这是一个例子。

例如,我已经像这样扩展了TextArea组件。这是迄今为止我能做的最好的,它绝对可以改进。就像,我不知道如何在按下下一个快捷键后使光标移动到最后。

public class TextArea extends mx.controls.TextArea
{
   // the keysmap is an example dictionary holding keycodes
   private var keysmap:*={
       112 = "some text for F1"
       ,113 = "the text for F2!"
       //etc, etc
   }

   public var handleKeyDown:Boolean =false;
   public function TextArea(){
       if(handleKeyDown ==true){
            this.addEventListener(KeyboardEvent.KEY_DOWN,this.keydownHandler);
    }
   }
   public  function keydownHandler(e:KeyboardEvent):void{

       if(e.keyCode >= 112 && e.keyCode <= 123){
        e.currentTarget["text"] += String(keysmap[e.keyCode]) +" ";
       }//focusManager.setFocus(this);      
   }
}

答案 2 :(得分:1)

我无法使用MXML为您提供解决方案,但是我的第一个想法是涉及一个单独的静态类,其中包含一个对象列表作为其键,动态创建的词典作为包含表示所需键的键的值组合按下功能参考值作为值。

所以,假设你有一个Sprite并且想要在焦点位于该对象时捕获ctrl + s进行保存,我会获得该Singleton的实例,并调用一个函数,例如在Sprite中传递的registerKeyBinding,keyCode你想要的,以及你预定义的回调:

private var registeredObjects:Dictionary = new Dictionary(true);

public function registerKeyBinding(targetObject:Object, keyCode:int, callback:Function) {   
    if (registeredObjects[targetObject]) {
        Dictionary(registeredObjects[targetObject])[keyCode] = callback;
    }
    else {
        registeredObjects[targetObject] = new Dictionary();
        Dictionary(registeredObjects[targetObject])[keyCode] = callback;
        targetObject.addEventListener(KeyboardEvent.KEY_DOWN, keyDownListener);
    }
}

private function keyDownListener(e:KeyboardEvent):void {
    if (e.ctrlKey == true) {
        //calls the function if that key exists.
        Dictionary(registeredObjects[e.target])[e.keyCode];
    }
}

不能说我已经测试了这个,但这只是我头脑中的第一件事。然后,您可以设置函数以从字典中取消注册和删除键,检查除keyCodes之外的对象的状态,删除旧的侦听器,以及在不再需要时删除整个字典。希望这至少有点帮助。