2009-05-23 11 views
2

Je l'ai fait beaucoup de programmation C# avec les deux Winforms et WPF. Je travaille maintenant sur une application Flex/Air pour le support multi-plateforme. Mais ceci est mon premier projet de flex, donc j'apprends comme je vais.Flex: Popup Window - Get [ok] ou [Annuler]

J'ai une fenêtre que je veux popup, que l'utilisateur remplira un formulaire, puis appuyez sur OK ou sur Annuler. Je l'ai mis la même façon que j'aurais en C#, mais il ne voit pas le problème, et je ne peux pas vraiment un moyen de faire faire ce que je veux.

EDIT: Je suis en train d'événements maintenant, les événements ne semblent pas être manipulés ...

EDIT à nouveau: Oh, c'est parce que le gestionnaire de pop-up semble créer une nouvelle instance de l'objet Form, plutôt que d'utiliser celui que j'ai déjà créé.

donc dans la méthode showWindow, je mets dans ce code plutôt que le gestionnaire popup:

parent.addChild(this); 

alors je l'enlever quand je le ferme. Le seul problème est qu'il ne désactive pas le reste du parent comme le fait le gestionnaire de popup. Des suggestions à ce sujet?

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

ENFANT:

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

Répondre

3

Vous pouvez le faire au moins deux façons différentes:

La première façon: Utilisation des événements

Laissez votre envoi de classe Form un événement lorsque l'un des boutons est cliqué. Après formulaire est instancié de la vue parent, ajouter un eventListener pour l'événement (s), il est connu de l'expédition. Lorsque le formulaire distribue l'événement, l'événement eventListener est appelé. Vous pouvez même réutiliser CloseEvent Flex et définissez la propriété « détail » soit Alert.OK ou Alert.CANCEL avant de l'envoyer.

En Forme:

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

Dans parent:

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 
} 

WAY SECONDE: L'utilisation callbacks

Ajouter un public var de type "Fonction" à votre classe de formulaire et fournir un rappel fonction du parent. Cela fait essentiellement la même chose que # 1 sauf avec un peu moins d'abstraction/indirection.

Je recommande # 1 puisque le modèle d'événement dans Flex est assez bien conçu et plus souple que le rappel.

+0

Cela semble que cela devrait fonctionner, mais l'événement ne semble pas seulement être manipulés ... enfant: fonction publique closeWindow(): void {var e \t: CloseEvent = new CloseEvent (CloseEvent. FERMER); \t e.detail = okClické? Alert.OK: Alert.CANCEL; \t dispatchEvent (e); \t \t PopUpManager.removePopUp (this); } parent: fonction privée btnAddRecipe_Clicked(): void {\t \t \t \t \t var recipeForm: RecipeForm = new RecipeForm(); \t recipeForm.addEventListener (CloseEvent.CLOSE, onRecipeFormClosed, false, 0, true); \t \t recipeForm.showWindow (this); } fonction privée onRecipeFormClosed (e: CloseEvent): void {// n'obtient obtient ici ...:/ } – Joel

+0

oh, les commentaires ne permettent pas de sauts de ligne ... oopps ... Je vais l'éditer dans mon post original. – Joel

+0

Eh bien, il semble que showWindow() renvoie une nouvelle instance de votre classe RecipeForm. Vous souhaitez attacher l'écouteur d'événement à cette classe. Vous devez vous assurer que l'objet dont vous envoyez l'événement est le même que celui sur lequel l'écouteur est enregistré. –

1

En Forme:

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

Dans parent:

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

Je ne sais pas si cela est encore une question ouverte. J'ai rencontré ce même problème et je pense avoir compris ce qui ne va pas. Au moins, j'ai fait pour mon problème.

J'ai implémenté les choses exactement comme vous l'avez fait. J'ai également l'attribut close défini sur closeWindow (j'utilise une TitleWindow pour ma boîte de dialogue). Par conséquent, lorsque la fenêtre est fermée via le X en haut, elle appellera closeWindow, et si vous cliquez sur le bouton Annuler, elle appellera également closeWindow. Le problème pour moi était que cliquer sur annuler, distribue un CloseEvent qui semble être attrapé par un écouteur qui appelle à nouveau la fenêtre closeWindow (éventuellement via l'attribut close qui crée probablement son propre écouteur interne). Je ne suis pas sûr que ce soit une boucle infinie mais Flex n'aime pas ça.

Ma solution était de créer deux fonctions, une pour la fenêtre de fermeture X à appeler et une pour le bouton Annuler pour distribuer un événement CloseEvent. Cela a semblé fonctionner pour moi. J'espère que cela vous aide.