Flex: всплывающее окно - получить [ок] или [отменить] - PullRequest
2 голосов
/ 23 мая 2009

Я много занимался программированием на C # как для Winforms, так и для WPF. Сейчас я работаю над приложением Flex / Air для кроссплатформенной поддержки. Но это мой первый гибкий проект, поэтому я учусь по ходу дела.

У меня есть окно, которое я хочу открыть, чтобы пользователь заполнил форму, а затем нажал ОК или ОТМЕНА. Я настроил его так же, как в C #, но он не работает, и я не вижу способа заставить его делать то, что я хочу.

EDIT: Так что я сейчас пытаюсь события, события, кажется, не обрабатываются ...

Снова отредактируйте: О, это потому, что менеджер всплывающих окон, кажется, создает новый экземпляр объекта Form, а не использует тот, который я уже создал.

поэтому в методе showWindow я вставил этот код, а не диспетчер всплывающих окон:

parent.addChild(this);

затем я удаляю его, когда закрываю. Единственная проблема в том, что он не отключает остальных родителей, как это делает менеджер всплывающих окон. Есть предложения по этому поводу?

РОДИТЕЛЕЙ:

private function btnAdd_Clicked():void
{               
        var form:Form = new Form();
        form.addEventListener(CloseEvent.CLOSE, onFormClosed, false, 0, true);

        recipeForm.showWindow(this);
}

private function onFormClosed(e:CloseEvent):void
{
    //none of these Alerts are ever shown. I also tried breakpoints in debug to try an follow the code, with no luck
    Alert.show("Closed");
    if(e.detail == Alert.OK)
    {
        Alert.show("OK");
    }
    else if(e.detail == Alert.CANCEL)
    {
        Alert.show("Cancel");
    }
}

РЕБЕНОК:

private function btnCancel_Clicked():void
{
    okClicked = false;
    closeWindow();
}

public function closeWindow():void
{
    var e:CloseEvent = new CloseEvent(CloseEvent.CLOSE);
    e.detail = okClicked ? Alert.OK : Alert.CANCEL;
    dispatchEvent(e);
    PopUpManager.removePopUp(this);
}

public function showWindow(parent:WindowedApplication):void
{
    var window:IFlexDisplayObject = PopUpManager.createPopUp(parent, RecipeForm, true);
    PopUpManager.centerPopUp(window);
}

Ответы [ 3 ]

3 голосов
/ 23 мая 2009

Вы можете сделать это как минимум двумя разными способами:

ПЕРВЫЙ ПУТЬ: Использование событий

Пусть ваш класс Form отправляет событие при нажатии любой из кнопок. После создания экземпляра Form из родительского представления добавьте eventListener для события, которое известно для отправки. Когда Form отправляет событие, вызывается eventListener. Вы можете даже повторно использовать FlexEvent Flex и установить для свойства «detail» значение Alert.OK или Alert.CANCEL перед его отправкой.

В форме:

var e:CloseEvent = new CloseEvent(CloseEvent.CLOSE);
e.detail = okClicked ? Alert.OK : Alert.CANCEL;
dispatchEvent(e);

В родительском:

var f:Form = new Form();
f.addEventListener(CloseEvent.CLOSE, onClose, false, 0, true);
...
private function onClose(e:CloseEvent):void
{
    if (e.detail == Alert.OK)
        // do something
    else if (e.detail == Alert.CANCEL)
        // do something else
}

ВТОРОЙ ПУТЬ: Использование обратных вызовов

Добавьте общедоступную переменную типа «Function» в класс Form и предоставьте функцию обратного вызова от родительского элемента. Это в основном то же самое, что и # 1, за исключением чуть меньшей абстракции / косвенности.

Я бы порекомендовал # 1, поскольку модель событий во Flex довольно хорошо продумана и более гибкая, чем обратный вызов.

1 голос
/ 11 июля 2009

В форме:

var e:CloseEvent = new CloseEvent(CloseEvent.CLOSE);
e.detail = okClicked ? Alert.OK : Alert.CANCEL;
dispatchEvent(e);

В родительском:

var f:Form = new Form();
f.addEventListener(CloseEvent.CLOSE, onClose, false, 0, true);
...
private function onClose(e:CloseEvent):void
{
    if (e.detail == Alert.OK)
        // do something
    else if (e.detail == Alert.CANCEL)
        // do something else
}
0 голосов
/ 14 ноября 2009

Не уверен, что это все еще открытый вопрос. Я столкнулся с той же самой проблемой, и я думаю, что понял, что не так. По крайней мере, я сделал для моей проблемы.

Я реализовал вещи точно так же, как вы. У меня также есть атрибут close, установленный на closeWindow (я использую TitleWindow для моего диалога).

Таким образом, когда окно закрывается с помощью X сверху, оно вызывает closeWindow, также, если вы нажмете кнопку Cancel, оно также вызовет closeWindow. Проблема для меня заключалась в том, что нажатие кнопки «Отмена» отправляет объект CloseEvent, который, похоже, перехватывается прослушивателем, который снова вызывает closeWindow (возможно, через атрибут close, который, вероятно, создает собственного внутреннего прослушивателя). Я не уверен, что это бесконечный цикл, но Flex не любит этого.

Мое решение состояло в том, чтобы создать две функции: одну для вызова окна закрытия X и одну для кнопки отмены для отправки собственного события CloseEvent. Казалось, это работает для меня. Надеюсь, это поможет вам.

...