2010-01-27 5 views
1

Je travaille actuellement sur un composant personnalisé qui étend Canvas (appelons-le SuperCanvas); Il s'agit essentiellement d'un conteneur qui vous permet de zoomer & son contenu.Déplacement des enfants d'un conteneur (défini en MXML) dans un "conteneur interne"

Il serait trop long d'expliquer pourquoi, mais je ne peux pas utiliser scrollRect, donc je suis obligé de déclarer un objet Canvas (appelé innerCanvas) ... dans mes SuperCanvas (je sais, pas très gentil = /)

Je voudrais savoir s'il existe un moyen approprié de "rediriger" la création des enfants de mon composant dans ce canevas.

Laissez-moi vous expliquer:

<comp:SuperCanvas id="superCanvas"> 
    <mx:Image id="img" source="image.jpg"/> 
    <mx:Label id="lbl" text="Sample"/> 
</comp:SuperCanvas> 

Avec cela, img et LBL sont ajoutés à mes SuperCanvas. Je veux qu'ils soient ajoutés à superCanvas.innerCanvas à la place.

Je ne peux pas remplacer les méthodes add/removeChild pour faire la "redirection", puisque je ne pourrai pas ajouter cette innerCanvas ...

J'ai donc essayé ceci:

<comp:SuperCanvas> 
    <comp:innerCanvas> 
     <mx:Image id="img" source="image.jpg"/> 
     <mx:Label id="lbl" text="Sample"/> 
    </comp:innerCanvas> 
</comp:SuperCanvas> 

Mais Flex se plaint que "Dans l'initialiseur pour 'contenu': tapez mx.controls.Image n'est pas assignable au type cible mx.containers.Canvas". J'ai lu que je pourrais utiliser un tableau de UIComponents avec un méta-code [ArrayElementType], et instancier manuellement des objets, mais je cherche une solution plus simple (et probablement appropriée).

J'ai également vu la propriété childDescriptor (qui contient des descriptions pour chaque enfant défini dans le fichier MXML), mais elle est en lecture seule, donc je ne peux pas la passer à innerCanvas.

Si je ne suis pas assez clair, ne pas hésiter à me demander precisions, l'anglais est pas ma langue maternelle, il est donc assez difficile d'expliquer les choses bien =/

Toute aide serait grandement appréciée, je suis complètement coincé.


EDIT: Ma classe SuperCanvas (moins les importations et le zoom & logique pan qui n'a pas d'importance ici):

public class SuperCanvas extends Canvas 
{ 
    public innerCanvas:Canvas = new Canvas(); 

    public function SuperCanvas() 
    { 
     super(); 
     addChild(innerCanvas); 
    } 
} 
+0

Quelle est la définition des classes SuperCanvas, innerCanvas? – Patrick

+0

J'ai édité ma question avec la définition. –

Répondre

1

Ce blog entry détails une approche dans laquelle vous ajoutez des composants aux SuperCanvas , mais ensuite déplacez-les tous vers la toile intérieure après la création. Donc, c'est une solution de contournement.

Vous pouvez également définir le DefaultProperty comme étant un objet de type dataProvider, puis ajouter des éléments dans le canevas interne, plutôt que d'en faire des enfants du SuperCanvas en premier.

Addition:

je suis tombé sur cette blog entry qui, entre autres, parle de la composante Panel et comment il gère ce problème.Vous pouvez le regarder et au code source Panel.

+0

Merci beaucoup pour votre aide! J'ai essayé la solution de jocabola.blog, ce qui me semble plutôt bien. Cependant, avec cette approche, je ne peux pas accéder à mon événement * innerCanvas * CREATION_COMPLETE (dont j'ai besoin pour récupérer sa largeur et sa hauteur). À la fin de la méthode addComponents(), ma largeur et hauteur de * innerCanvas * sont toutes deux égales à 0. –

+0

Hmm. Pouvez-vous appeler 'validateNow' sur le conteneur [interne ou externe] pour le forcer à travers les mouvements? –

+0

J'ai essayé, mais il semble que je suis confronté à un autre problème maintenant; les propriétés width et height restent égales à 0. Le problème est que les composants Image que j'ai mis dans mon canvas n'ont pas fini de charger à ce stade. J'ai remplacé la classe Image afin de distribuer son événement creationComplete seulement après que le chargement soit terminé (quand ses propriétés width et height sont disponibles). Mais j'ai fini par comprendre que les conteneurs Flex n'attendent pas que leur enfant envoie son propre événement creationComplete pour envoyer leur (pas sûr que je sois très clair, désolé = /) En passant, c'est un autre problème. Merci beaucoup! –

Questions connexes