2010-01-15 4 views
1

Je viens de lire un commentaire à FlexExamples:Comment déposer quelque chose dans un objet Flex Tree?

Une chose à noter à propos de l'arbre est qu'il est vraiment juste une liste dans laquelle les éléments sont affichés. Qu'est-ce que cela signifie, vous ne pouvez pas vraiment laisser tomber quelque chose "dans" le dossier, sauf si le dossier est ouvert. Même dans ce cas, l'expérience utilisateur n'est pas tout à fait correcte. Essayez donc de tout sortir de l'un des dossiers, puis réduisez ce dossier vide. Si vous déposez quelque chose sur le dossier, il se retrouve entre le dossier cible et celui situé en dessous ou au-dessus. Ceci est indiqué par la ligne noire qui apparaît lorsque vous déplacez la souris sur les dossiers. Si vous "ouvrez" le dossier (la seule façon de dire qu'il est ouvert est par la flèche) et que vous l'essayez, vous obtenez une zone de dépôt supplémentaire qui correspond à la moitié inférieure du dossier vide ouvert. Ceci est également indiqué par la position des lignes noires.

Il serait préférable que la section centrale de n'importe quel élément soit toujours la zone de dépôt pour "ajouter à ce dossier" et que les bords supérieur et inférieur puissent être respectivement déposés au-dessus ou au-dessous.

Je viens d'en arriver au même problème. Est-ce que quelqu'un a déjà géré ce problème? Dans mon cas, j'ai dragMoveEnabled dans l'arbre et offre la possibilité de faire glisser les éléments de l'arbre. Mais il est impossible de faire glisser un élément dans un autre élément vide. Vous pouvez uniquement déposer l'élément déplacé au-dessus ou en dessous d'un élément vide.

Répondre

1

J'ai manipulé le problème suivi:

  • Dans le gestionnaire d'événements dragOver: démarrer une minuterie pour déterminer combien de temps l'utilisateur a traîné l'élément sur l'élément en cours
  • si l'élément en cours a pas d'enfant, ajoutez un nouvel enfant avec le titre "déposer l'élément ici"
  • supprime l'enfant ajouté après que l'élément a été supprimé (dans le gestionnaire dragComplete) ou l'utilisateur a déplacé l'élément déplacé de l'élément actuel (dans le gestionnaire dragOver)
1

C'est ce que je fais dès maintenant:

var i:IListItemRenderer = (event.currentTarget as Tree).indexToItemRenderer((event.currentTarget as Tree).calculateDropIndex(event)); 
var x:XML = XML(i.data); 
if (x.children().length() == 0 && [email protected] != 'Drop Node Here') 
    x.appendChild("<node title='Drop Node Here' />"); 

je dois obtenir l'arbre de cette façon parce que mes arbres sont construites dynamiquement. Mais de toute façon, cela ajoute un nœud à n'importe quel nœud qui n'a pas d'enfant, et ajoutera seulement un seul nœud. Maintenant, je dois juste mettre en place une minuterie afin que cela ne se produise que si vous passez la souris sur le nœud pendant une seconde.

+0

Oui, c'est ce que je fais aussi, sauf que je n'utilise pas XML. – Thomas

2

Je fais comme ça:

protected function onDragOver(event:DragEvent):void { 
    event.preventDefault(); 
    event.currentTarget.hideDropFeedback(event);     

    try { 
     var index:int = tree.calculateDropIndex(event); 
    } catch(e:Error) { 
     DragManager.showFeedback(DragManager.NONE); 
     return; 
    } 

    tree.selectedIndex = index; 

    var draggedOverItem:Object = tree.selectedItem; 
} 

Peut-être il y a même une meilleure façon de régler le selectedIndex et en utilisant le selectedItem?

0

Ma solution:

Sous AdvancedDataGrid et passer outre showDropFeedback. Avant d'appeler le super.showDropFeedback, ouvrez le noeud que vous faites glisser si c'est un dossier vide sans enfant.

Questions connexes