我用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);
}
答案 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。这似乎对我有用。希望它可以帮到你。