Управление предупреждением Flex: активация кнопки «по умолчанию» при нажатии клавиши ввода / пробела - PullRequest
1 голос
/ 17 декабря 2009

Независимо от того, что я пытаюсь, я не могу вызвать событие click для кнопки «по умолчанию» в элементе управления Alert в приложении Flex 3.4.

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 указывает, что опция «по умолчанию» (из побитового списка в 3-м аргументе) является кнопкой «Да». Теоретически, и исходя из моего опыта разработки приложений для Windows, «кнопка по умолчанию» означает, что нажатие клавиши ввода (или иногда пробела) вызывает событие нажатия для этой кнопки.

Если это имеет значение, то оповещение является модальным.

Я вижу, что кнопка имеет стиль по умолчанию: она получает немного ореола или дополнительную границу по сравнению с кнопкой «Отмена» или по сравнению с ней при передаче нуля в качестве последнего аргумента.

Однако нажатие клавиш ввода и пробела, похоже, никак не влияет. Я делаю что-то не так или пропускаю какой-то важный шаг для того, чтобы заставить эту функциональность работать?


Обновление 2010-02-17:

На основании моего второго комментария к ответу @ rhtx:

Хорошо, наконец-то дошли до попытки это. Так как класс Alert использует много статических методов, я просто скопировал классы Alert и AlertForm в свой проект (и исправил несколько относительных путей для включений), и в результате я получил более уродливое окно предупреждения, которое работает (или не работает). (в зависимости от вашей точки зрения) так же, как класс оповещения ванили. Однако я осознал, что, если вы нажмете TAB, он будет фокусировать кнопки оповещения, и в этот момент нажатие Escape / Enter будет иметь желаемый эффект ... Так как же устранить необходимость нажатия TAB?

Я попробовал еще несколько вещей и никуда не попал.

Я пытался подделать нажатие клавиши TAB после открытия оповещения (с типами событий KEY_DOWN и KEY_UP):

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);

Я также нашел это сообщение в блоге и попытался сделать это, чтобы сфокусировать alertForm:

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

Ни одна из этих ошибок не сгенерировала, но ни одна не дала желаемого результата.

Ответы [ 2 ]

1 голос
/ 17 декабря 2009

Я бы подошел к этому, расширив класс Alert, включив в него функциональность, которая прослушивает события keyUp от клавиш Enter и Space.

В методе createChildren вашего подкласса:

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...
    }
}

У меня возникли некоторые проблемы с настройкой сегодня утром, и я не могу попасть в класс Alert, чтобы предоставить информацию о том, как "активировать функциональность Alert.YES", но я постараюсь опубликовать еще немного об этом позже. Надеюсь, это немного поможет.

Также - я не на 100% в этом - но я думаю, что вам нужно будет вручную удалить прослушиватели событий, когда всплывающее окно Alert будет удалено.

Ааа ... вам может не понадобиться оба этих слушателя. Не могу сейчас проверить, чтобы убедиться.

ОБНОВЛЕНИЕ: -----------------

После небольшого изучения, возможно, лучший способ сделать это - расширить класс AlertForm (который управляет кнопками Alert), а затем расширить класс Alert, чтобы использовать расширенный класс AlertForm.

Класс 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");
    }
}

Вы можете видеть, что он настраивает поведение 'close' в ответ на нажатие клавиши Escape. Вы добавляете небольшую логику, основанную на коде в вышеупомянутой функции 'keyUpListener', чтобы вызывать метод removeAlert AlertForm, передавая соответствующее значение String для кнопки Yes.

Для справки метод removeAlert выглядит следующим образом:

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);

}
0 голосов
/ 18 ноября 2013

Я столкнулся с подобной ситуацией. Что вытащило меня из этого было:

(1) определение кнопки по умолчанию в Alert.show(), (2) с помощью callLater() и (3) установка фокуса вручную на кнопку по умолчанию.

Например, используя Alert.CANCEL в качестве предполагаемой кнопки по умолчанию (при необходимости можно изменить на Alert.YES):

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();
}

Это позволяет клавишам Escape и Enter работать так, как если бы пользователь щелкнул мышью на кнопке по умолчанию.

...