【问题标题】:Flex: Popup Window - Get [ok] or [cancel]Flex:弹出窗口 - 获取 [ok] 或 [cancel]
【发布时间】:2009-05-23 02:46:05
【问题描述】:

我已经使用 Winforms 和 WPF 完成了很多 C# 编程。我现在正在开发一个 Flex/Air 应用程序以获得跨平台支持。但这是我的第一个 flex 项目,所以我边走边学。

我有一个要弹出的窗口,用户将填写表格,然后点击确定或取消。我以与 C# 中相同的方式设置它,但它不起作用,而且我真的找不到让它做我想做的事情的方法。

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

再次编辑: 哦,这是因为弹出管理器似乎创建了一个新的 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);
}

【问题讨论】:

    标签: apache-flex air popup


    【解决方案1】:

    您至少可以通过两种不同的方式做到这一点:

    第一种方式:使用事件

    让您的 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 中的事件模型设计得非常好,并且比回调更灵活。

    【讨论】:

    • 这似乎应该可以工作,但事件似乎没有被处理... child: public function closeWindow():void { var e:CloseEvent = new CloseEvent(CloseEvent.CLOSE ); e.detail = okClicked ?警报确定:警报取消;调度事件(e); PopUpManager.removePopUp(this); } 父级:私有函数 btnAddRecipe_Clicked():void { var recipeForm:RecipeForm = new RecipeForm(); recipeForm.addEventListener(CloseEvent.CLOSE, onRecipeFormClosed, false, 0, true); recipeForm.showWindow(this); } private function onRecipeFormClosed(e:CloseEvent):void { //永远不会到达这里... :/ }
    • 哦,cmets 不允许换行...哎呀...我将其编辑到我的原始帖子中。
    • 好吧,看起来 showWindow() 正在返回您的 RecipeForm 类的新实例。您想将事件侦听器附加到该类。您需要确保您从中分派事件的对象与注册了侦听器的对象相同。
    【解决方案2】:

    形式:

    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
    }
    

    【讨论】:

      【解决方案3】:

      不确定这是否仍然是一个悬而未决的问题。我遇到了同样的问题,我想我知道出了什么问题。至少我为我的问题做了。

      我完全按照你的方式实现了。我还将 close 属性设置为 closeWindow(我在对话框中使用 TitleWindow)。

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

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

      【讨论】:

        猜你喜欢
        • 2012-01-18
        • 2014-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多