Il testo a più righe in Flex non viene ricalcolato quando viene modificato il runtime css
-
10-07-2019 - |
Domanda
Per considerazioni sul tempo di caricamento sto usando un file css di runtime nella mia applicazione Flex.
Sto riscontrando un problema con un controllo di testo su più righe:
<mx:Text id="txtDescription" selectable="false"
styleName="imageRolloverButtonTextDark" width="100%" textAlign="center"
text="{_rolloverText}"/>
Quando il mio foglio di stile CSS ha caricato lo stile del testo cambia correttamente, ma l'altezza non viene ricalcolata. Sembra essere solo un campo a riga singola.
FYI: il controllo non è effettivamente visibile e attivato da un rollover. Quindi non mi interessa davvero se il foglio di stile non è stato caricato e ottengono un testo di sistema standard. Voglio solo che sia l'altezza corretta quando è stata caricata.
Soluzione
Per chiunque abbia questo problema, la soluzione che ho trovato è stata quella di creare un componente personalizzato estendendo mx.controls.Text
e quindi sovrascrivere il metodo styleChange () e chiamare esplicitamente il metodo invalidateDisplayList () per il campo di testo una volta applicato lo stile.
Dovrebbe essere chiamato automaticamente quando lo stile è cambiato ma no ... per qualche motivo in Flex 3.5 non lo è.
TextObject di classe pubblica estende Text {// ... sovrascrive la funzione pubblica styleChanged (styleProp: String): void {invalidateDisplayList (); } }
Spero di salvarne qualcuno tutto il tempo che ci ho perso.
Altri suggerimenti
Secondo la documentazione Adobe per il testo
Dimensionamento di un controllo Text
Flex misura il Controllo del testo come segue:
Se si specifica un valore in pixel per entrambi le proprietà di altezza e larghezza, qualsiasi testo che supera le dimensioni di il controllo è troncato al confine.
Se si specifica un pixel esplicito larghezza, ma senza altezza, Flex avvolge il file testo per adattarsi alla larghezza e calcola l'altezza per adattarsi al numero richiesto di linee.
Se si specifica una percentuale larghezza e nessuna altezza, Flex no avvolgere il testo e l'altezza è uguale il numero di righe determinato da il numero di caratteri di ritorno.
Se si specifica solo un'altezza e no larghezza, il valore dell'altezza no influenza il calcolo della larghezza e Flex ridimensiona il controllo per adattarlo alla larghezza di la linea massima.
Come regola generale, se hai tempo testo, è necessario specificare un pixel-based proprietà width. Se il testo potesse cambiare e si desidera garantire che il file Il controllo del testo assume sempre lo stesso spazio nell'applicazione, impostare proprietà esplicite di altezza e larghezza che si adatta al testo più ampio previsto.
Quindi il trucco che ho usato per affrontare questo è di far sì che il Testo ottenga la sua larghezza tramite un'espressione vincolante da qualunque contenitore limiti la sua larghezza, in genere il genitore immediato.
per es.
<mx:Canvas id="box" width="100%" backgroundColor="Red">
<mx:Text width="{box.width}" text="{someReallyLongString}" />
</mx:Canvas>
Potresti usare una larghezza di pixel fissa invece del 100%? Ho avuto problemi con il 100% calcolato erroneamente su controlli dinamici di testo prima.