2009-05-23 10 views
2

我已經用Winforms和WPF做了很多C#編程。我正在爲Flex/Air應用程序開發跨平臺支持。但這是我的第一個靈活項目,所以我正在學習。Flex:彈出窗口 - 獲取[ok]或[取消]

我有一個窗口,我想彈出,用戶將填寫表單,然後點擊確定或取消。我將它設置爲與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); 
} 

回答

3

你可以做到這一點,至少兩種不同的方式:

第一種方法:使用事件

讓您的Form類調度點擊任一按鈕時發生的事件。在從父視圖實例化窗體後,爲已知要分派的事件添加一個eventListener。當表單分派事件時,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」 類型的公共變種到您的Form類,並提供一個回調函數從父。這與#1基本上是一樣的,除了抽象/間接少一點。

我會推薦#1,因爲Flex中的事件模型相當精心構思,比回調更靈活。

+0

這似乎是它應該工作,但事件似乎並不需要處理...... 孩子: 公共職能closeWindow():無效 { \t變種E:=的closeEvent新的closeEvent(的closeEvent。關); \t e.detail = okClicked? Alert.OK:Alert.CANCEL; (e); \t dispatchEvent(e); \t \t PopUpManager.removePopUp(this); } 父: 私有函數btnAddRecipe_Clicked():無效 {\t \t \t \t \t VAR recipeForm:RecipeForm =新RecipeForm(); \t recipeForm.addEventListener(CloseEvent.CLOSE,onRecipeFormClosed,false,0,true); \t \t recipeForm.showWindow(this); } 私有函數onRecipeFormClosed(E:的closeEvent):無效 {// 永遠不會送過來...:/ } – Joel 2009-05-23 05:43:04

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

不知道這仍然是一個懸而未決的問題。我遇到了同樣的問題,我想我找出了什麼是錯的。至少我爲我的問題做了。

我按照你的方式執行了一些事情。我也有close屬性設置爲closeWindow(我正在使用TitleWindow作爲我的對話框)。

所以當窗口通過頂部的X關閉時,它會調用closeWindow,同樣如果你點擊Cancel按鈕,它也會調用closeWindow。 對我來說,問題在於單擊取消,調度了一個CloseEvent,它似乎被一個再次調用closeWindow的監聽器捕獲(可能通過可能創建自己的內部監聽器的close屬性)。我不確定它是一個無限循環,但Flex不喜歡這個。

我的解決方案是創建兩個函數,一個用於調用X關閉窗口,另一個用於取消按鈕來調度它自己的CloseEvent。這似乎對我有用。希望它可以幫助你。

相關問題