2009-08-31 6 views
2

Existe-t-il une solution de contournement pour l'affichage de texte multiligne dans Flex 3? Les deux contrôles que j'ai essayés jusqu'ici sont mx: Text, et mx: TextArea. Chaque contrôle a son propre bug associé. Pour référence: mx: Bogue texte - http://bugs.adobe.com/jira/browse/SDK-9819 mx: Bogue TextArea - http://bugs.adobe.com/jira/browse/SDK-12616. Fondamentalement, aucun contrôle ne gère correctement le défilement si vous ne spécifiez pas de hauteur et que le texte revient à la ligne suivante (la hauteur est déterminée dynamiquement par Flex, en fonction de l'encapsulation). Est-ce que quelqu'un a une solution de contournement qui pourrait être utile?Existe-t-il une solution de contournement de texte multiligne pour Flex

Merci.

Mise à jour: L'une des méthodes que j'ai essayées dans le passé a consisté à calculer manuellement la hauteur d'un élément mx: Text. Je peux le faire en utilisant les éléments suivants:

var textItem:Text = new Text(); 
var len:int = value.length; 
var lines:int = int(len/115) + 1; 
var height:int = lines * 20; 
textItem.height = height; 

Bien que cela semble contourner le problème en mx: texte, il y a une grande faute. Le calcul dépend fortement de la taille de police, de l'espacement des lettres et de la largeur de textItem. Je peux utiliser cette méthode et passer à mon projet. Cependant, la maintenance est inévitable, et avec un code comme celui-ci, ce sera un PITA gigantesque.

+0

Pourquoi ne pas spécifier la hauteur? –

+0

Le texte qui remplira ce champ peut contenir de 0 à 1024 caractères. Si je spécifie la hauteur pour le cas de bord de 1024 l'interface utilisateur semble vide avec une chaîne de un ou deux mots. Je vais mettre à jour la question avec un autre cas que j'ai essayé. –

Répondre

7

J'ai dû faire face à cela plusieurs fois moi-même. Le meilleur moyen que j'ai trouvé pour obtenir le dimensionnement dynamique en hauteur de <mx:Text> est de laisser la hauteur hors du texte, puis de spécifier un pourcentage de hauteur de 100% sur la VBox, la HBox, etc .. Quelque chose comme ceci devrait fonctionner pour vous:

<mx:VBox width="100%" height="100%"> 
    <mx:Text text="Your really long text goes here." width="100%"/> 
</mx:VBox> 

Comme c'est un peu un hack lui-même, votre kilométrage peut varier.

Modifier

Si vous voulez prolonger votre exemple ci-dessus afin que la maintenance du code est plus facile, vous devriez regarder dans la classe TextLineMetrics. Cela vous permettra de mesurer la largeur et la hauteur de votre texte, en tenant compte de la police, de la taille, etc. Les documents pour TextLineMetrics peuvent être trouvés here. Pour utiliser votre exemple ci-dessus, vous voulez faire quelque chose comme ce qui suit:

var textItem:Text = new Text(); 
var metrics:TextLineMetrics = textItem.measureText(value); 
var len:int = metrics.width; 
var lines:int = int(len/textItem.width) + 1; 
var height:int = lines * metrics.height; 
textItem.height = height; 
+0

Je vais essayer cela, et voir comment ça se passe. Merci. –

+0

L'objet TextLineMetrics a l'air de s'imposer ici. Je dirai que dans la plupart des cas que j'ai essayés, j'ai dû ajouter textItem à son parent avant de créer des métriques. Sinon, j'obtiendrais une erreur anti-aliasing. –

1

utiliser une variable classe zone de texte de hauteur qui fonctionne très bien pour moi:

package 
{ 
    import mx.controls.TextArea; 

    /** 
    * TextArea that xpands to the height of the content contained 
    * within. 
    * @author joel 
    * 
    */ 
    public class VariableHeightTextArea extends TextArea 
    { 
     public function VariableHeightTextArea() 
     { 
      super(); 
     } 

     override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number) : void 
     { 
      super.updateDisplayList(unscaledWidth, unscaledHeight); 
      if(this.height != int(this.textField.measuredHeight) + 5) 
      { 
       this.height = this.textField.measuredHeight + 5; 
      }   
     } 
    } 
} 
+0

Cela semble être une classe utile, mais le bogue # 12616 (lié ci-dessus) est vraiment ce qui m'empêche d'utiliser un TextArea. La façon dont TextAreas gère les événements de défilement est plutôt boiteuse. –

Questions connexes