Flex:弹出窗口 - 获取[ok]或[取消]

时间:2009-05-23 02:46:06

标签: flex air popup

我用Winforms和WPF做了很多C#编程。我现在正在开发Flex / Air应用程序以获得跨平台支持。但这是我的第一个灵活项目,所以我正在学习。

我有一个我要弹出的窗口,用户将填写表单,然后点击OK或CANCEL。我的设置方式与我在C#中的设置方式相同,但它不起作用,我无法真正看到让它按照我的意愿行事的方法。

编辑: 所以我现在正在尝试事件,事件似乎没有被处理......

再次编辑: 哦,这是因为弹出管理器似乎创建了一个Form对象的新实例,而不是使用我已创建的实例。

所以在showWindow方法中,我输入的代码而不是弹出管理器:

parent.addChild(this);

然后我关闭它时将其删除。唯一的问题是,它不会像弹出管理器那样禁用父节点的其余部分。有什么建议吗?

PARENT:

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

CHILD:

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 个答案:

答案 0 :(得分:3)

您可以通过至少两种不同的方式完成此任务:

第一种方式:使用事件

当单击任一按钮时,让Form类调度一个事件。在从父视图实例化Form之后,为已知要调度的事件添加eventListener。当Form调度事件时,将调用eventListener。您甚至可以重新使用Flex的CloseEvent,并在调度之前将“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”的公共var添加到Form类中,并从父级提供回调函数。这与#1基本相同,只是抽象/间接少了。

我建议#1,因为Flex中的事件模型设计得非常好,并且比回调更灵活。

答案 1 :(得分:1)

表格:

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
}

答案 2 :(得分:0)

不确定这是否仍然是一个未解决的问题。我遇到了同样的问题,我想我弄清楚了什么是错的。至少我为我的问题做了。

我完全像你一样实施了。我也将close属性设置为closeWindow(我在对话框中使用TitleWindow)。

因此,当窗口通过顶部的X关闭时,它将调用closeWindow,如果单击“取消”按钮,它也将调用closeWindow。 对我来说问题是单击取消,调度一个似乎被监听器捕获的CloseEvent,该监听器再次调用closeWindow(可能通过close属性创建自己的内部监听器)。我不确定它是否是一个无限循环,但Flex不喜欢这个。

我的解决方案是创建两个函数,一个用于调用X关闭窗口,另一个用于取消按钮以调度自己的CloseEvent。这似乎对我有用。希望它可以帮到你。