Le texte multiligne dans Flex ne recalcule pas lorsque le css d'exécution est modifié
-
10-07-2019 - |
Question
Pour des raisons de temps de chargement, j'utilise un fichier CSS d'exécution dans mon application Flex.
Je rencontre un problème avec un contrôle de texte multiligne:
<mx:Text id="txtDescription" selectable="false"
styleName="imageRolloverButtonTextDark" width="100%" textAlign="center"
text="{_rolloverText}"/>
Lorsque ma feuille de style CSS a été chargée, le style de texte change correctement, mais la hauteur n'est pas recalculée. Il semble s’agir d’un simple champ de ligne.
FYI: le contrôle n'est pas réellement visible et est déclenché par un basculement. Donc, je ne me soucie pas vraiment si la feuille de style n'a pas été chargée et qu'ils obtiennent du texte système standard. Je veux juste que ce soit à la bonne hauteur quand il a été chargé.
La solution
Pour tous ceux qui ont ce problème, la solution que j'ai trouvée consistait à créer un composant personnalisé prolongeant le fichier mx.controls.Text
.puis substituez la méthode styleChange () et appelez explicitement la méthode invalidateDisplayList () pour le champ de texte une fois le style appliqué.
Il devrait être appelé automatiquement lorsque le style est modifié, mais non ... pour une raison quelconque dans flex 3.5, ce n'est pas le cas.
public class TextObject étend Text {// ... redéfinit la fonction publique styleChanged (styleProp: String): void {invalidateDisplayList (); } }
J'espère que cela sauvera quelqu'un tout le temps que j'ai perdu dessus.
Autres conseils
Selon la documentation d'Adobe pour Text
Dimensionnement d'un contrôle de texte
Flex mesure la Contrôle du texte comme suit:
Si vous spécifiez une valeur de pixel pour les deux les propriétés de hauteur et de largeur, toute texte dépassant la taille du le contrôle est coupé à la frontière.
Si vous spécifiez un pixel explicite largeur, mais pas de hauteur, Flex enveloppe la texte pour adapter la largeur et calcule la hauteur pour s'adapter au nombre requis de lignes.
Si vous spécifiez une valeur en pourcentage largeur et pas de hauteur, Flex ne le fait pas envelopper le texte, et la hauteur est égale le nombre de lignes déterminé par le nombre de caractères de retour.
Si vous ne spécifiez qu'une hauteur et non largeur, la valeur de hauteur ne affecter le calcul de la largeur, et Flex dimensionne le contrôle à la largeur de la ligne maximale.
En règle générale, si vous avez longtemps texte, vous devez spécifier un pixel propriété width. Si le texte pouvait changer et vous voulez vous assurer que le Le contrôle de texte prend toujours le même espace dans votre application, définissez propriétés explicites de hauteur et de largeur qui correspondent au plus grand texte attendu.
Le truc que j’ai utilisé pour résoudre ce problème consiste à faire en sorte que le texte obtienne sa largeur via une expression de liaison, quel que soit le conteneur qui limite sa largeur, généralement le parent immédiat.
par exemple
<mx:Canvas id="box" width="100%" backgroundColor="Red">
<mx:Text width="{box.width}" text="{someReallyLongString}" />
</mx:Canvas>
Pourriez-vous utiliser une largeur de pixel fixe au lieu de 100%? J'ai eu des problèmes avec 100% ayant été mal calculés sur des contrôles de texte dynamiques auparavant.