代码之家  ›  专栏  ›  技术社区  ›  Adam Tuttle

Flex Alert控件:在按enter/space键时激活“默认”按钮

  •  1
  • Adam Tuttle  · 技术社区  · 15 年前

    Alert.show(
        'Are you sure you want to delete the selected link?',
        'Confirm Delete',
        Alert.YES | Alert.CANCEL,
        null, 
        confirmDelete, 
        null, 
        Alert.YES
    );
    

    在上面的代码示例中,最后一个参数: Alert.YES 指定“default”选项(来自第3个参数中的按位列表)是“Yes”按钮。理论上,根据我设计Windows应用程序的经验,“default button”意味着按下enter键(有时是空格键)会触发该按钮的click事件。

    如果有关系的话,这个警报是模态的。

    但是,按回车键和空格键似乎没有影响。我是做错了什么,还是错过了让这个功能发挥作用的关键一步?


    我又试了几次,都没成功。

    var a:Alert = Alert.show(msg, title, Alert.YES | Alert.CANCEL, null, fnCb);
    var tabEvent:KeyboardEvent = new KeyboardEvent(
        KeyboardEvent.KEY_DOWN,
        true,
        false, 
        0,
        Keyboard.TAB
    );
    a.dispatchEvent(tabEvent);
    

    this blog post 试着这样做来集中注意力 alertForm :

    var a:Alert = Alert.show(msg, title, Alert.YES | Alert.CANCEL, null, fnCb);
    a.mx_internal::alertForm.setFocus();
    

    这些都没有抛出错误,但也没有产生预期的结果。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Ross Henderson    15 年前

    我将通过扩展Alert类来实现这一点,以包括侦听来自Enter和Space键的keyUp事件的功能。

    override public function createChildren():void
    {
        super.createChildren();
        this.addEventListener(KeyboardEvent.KEY_UP, keyUpListener);
        this.stage.addEventListener(KeyboardEvent.KEY_UP, keyUpListener);
    }
    
    private function keyUpListener(e:KeyboardEvent):void
    {
        if(e.keyCode == Keyboard.ENTER || e.keyCode == Keyboard.SPACE)
        {
            //Trigger the Alert.YES functionality...
        }
    }
    

    我今天早上的设置有一些问题,无法进入警报类以提供有关如何“触发警报”的信息警惕。是的功能”,但我稍后会尝试发布更多关于这个的内容。希望这一点有用。

    啊,还有。。。你可能不需要这两个听众。现在无法测试以确定。

    更新:-----------------

    AlertForm类有一个keyDownHandler方法,其定义如下:

    override protected function keyDownHandler(event:KeyboardEvent):void
    {
        var buttonFlags:uint = Alert(parent).buttonFlags;
    
        if (event.keyCode == Keyboard.ESCAPE)
        {
            if ((buttonFlags & Alert.CANCEL) || !(buttonFlags & Alert.NO))
                removeAlert("CANCEL");
            else if (buttonFlags & Alert.NO)
                removeAlert("NO");
        }
    }
    

    您可以看到,它正在设置“关闭”行为,以响应按Escape键。根据上面“keyUpListener”函数中的代码,添加一点逻辑,调用AlertForm的removeAlert方法,为Yes按钮传递适当的字符串值。

    private function removeAlert(buttonPressed:String):void
    {
        var alert:Alert = Alert(parent);
    
        alert.visible = false;
    
        var closeEvent:CloseEvent = new CloseEvent(CloseEvent.CLOSE);
        if (buttonPressed == "YES")
            closeEvent.detail = Alert.YES;
        else if (buttonPressed == "NO")
            closeEvent.detail = Alert.NO;
        else if (buttonPressed == "OK")
            closeEvent.detail = Alert.OK;
        else if (buttonPressed == "CANCEL")
            closeEvent.detail = Alert.CANCEL;
        alert.dispatchEvent(closeEvent);
    
        mx.managers.PopUpManager.removePopUp(alert);
    
    }
    
        2
  •  0
  •   ggkmath    11 年前

    我也遇到了类似的情况。让我摆脱困境的是:

    (1) 在中定义默认按钮 Alert.show() callLater() ,和(3)在默认按钮上手动设置焦点。

    例如,使用提醒.取消作为预期的默认按钮(可以更改为警惕。是的如果需要):

    var a:Alert = Alert.show(msg, title, Alert.YES | Alert.CANCEL, null, fnCb, null, Alert.CANCEL);
    callLater(setAlertButtonFocus,[a]);
    ...
    private function setAlertButtonFocus(a:Alert):void {
        a.mx_internal::alertForm.mx_internal::defaultButton.setFocus();
    }