Bonjour,
Je cherche a créer des Panels ou autre TitleWindow a la volée, cela ne pose pas de probleme, dans une fonction AS3 je fait :
Maintenant, je veut faire pareil avec un custom component, qui utilise le code behind.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 public function onNewWindow():void { var oPanel:Panel = new Panel; mx.managers.PopUpManager.addPopUp(oPanel, this, false); }
fichier MenuTest.mxml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <?xml version="1.0" encoding="utf-8"?> <comp:MenuTestClass xmlns:comp="components.*" xmlns:mx="http://www.adobe.com/2006/mxml" > <mx:Canvas> <mx:Button label="Sauvegarder" id="btnSave" /> </mx:Canvas> </comp:MenuTestClass>
Fichier MenuTestClass.as
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package components { import mx.controls.*; import mx.containers.*; import mx.events.FlexEvent; public class MenuTestClass extends TitleWindow { public var btnSave:Button; public function MenuTestClass() { btnSave.addEventListener("click", onSave); this.title = "Settings"; this.alpha = 0.98; this.percentHeight = 100; this.percentWidth = 100; this.x = 320; this.y = 90; } private function onSave():void { Alert.show("onSave"); // etc } } }
Voici le probleme : Apparemment, le code behind est effectif uniquement si le composant est instanciée en mxml
Application principale :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 ... <MenuTest> .... <MenuTest/> ...
Ceci ne m'intéresse pas, car comme dit le composant est crée a la volé, en reprenant le premier exemple, mais avec utilisation du custom component.
en utilisant le nom de la class AS
Résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public function onNewWindow():void { var oTest:MenuTestClass = new MenuTestClass ; mx.managers.PopUpManager.addPopUp(oTest, this, false); }
Ce qui veut dire que le btnSave n'est pas instancié, mais juste définit, le code behind n'est plus effectif et la fenetre n'est pas affiché, car on ne passe pas par le code mxml. Cela marche si j'instancie btnSave = new Button et que je l'ajoute avec un this.addChild(btnSave). Comme pour creer un compsant uniquement en AS (le mxml est donc ignoré)TypeError: Error #1009: Il est impossible d'accéder à la propriété ou à la méthode d'une référence d'objet nul.
at components::MenuTestClass()[...\src\components\MenuTestClass.as:13]
Quand je commente la ligne 13 (btnSave.addEventListener("click", onSave); ) la titleWindow s'affiche sans composants a l'intérieur.
____________________________________________________________
En utilisant le nom du fichier mxml, comme on le ferai dans une instanciation en mxml.
Quand je commente la ligne 13 (btnSave.addEventListener("click", onSave); ) la titleWindow s'affiche avec les composants, mais bien sur la fonction onSave ne peut etre appelle.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public function onNewWindow():void { var oTest:MenuTest = new MenuTest ; mx.managers.PopUpManager.addPopUp(oTest, this, false); }
Alors, le code behind n'est pas supporté depuis l'action script ? d'ailleurs dans le tuto d'adobe http://www.adobe.com/devnet/flex/qui...g_code_behind/ le composant est bien instancié en mxml
Dernière remarque, le code behind fonctionne uniquement pour l'instance (this) du composant, ainsi un this.title = "Quarante deux "; changera bien le titre, mais les membres ne sont pas bindé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 <?xml version="1.0" encoding="utf-8"?> <custom:ApplicationClass xmlns:custom="components.*" viewSourceURL="src/CodeBehind/index.html" width="400" height="310" > <custom:PaddedPanel title="Code Behind"> <custom:AddressForm id="addressForm"/> </custom:PaddedPanel> </custom:ApplicationClass>
Partager