El texto de varias líneas en Flex no se recalcula cuando se cambia el tiempo de ejecución css
-
10-07-2019 - |
Pregunta
Por consideraciones de tiempo de carga, estoy usando un archivo css en tiempo de ejecución en mi aplicación Flex.
Tengo un problema con un control de texto de varias líneas:
<mx:Text id="txtDescription" selectable="false"
styleName="imageRolloverButtonTextDark" width="100%" textAlign="center"
text="{_rolloverText}"/>
Cuando mi hoja de estilo CSS se ha cargado, el estilo de texto cambia correctamente, pero la altura no se vuelve a calcular. Parece ser solo un campo de una sola línea.
FYI: El control no es realmente visible y se activa por un rollover. Por lo tanto, no me importa si la hoja de estilo no se ha cargado y obtienen el texto estándar del sistema. Solo quiero que tenga la altura correcta cuando se haya cargado.
Solución
Para cualquier otra persona que tenga este problema, la solución que encontré fue crear un componente personalizado que extendiera el mx.controls.Text
y luego anula el método styleChange (), y llama explícitamente al método invalidateDisplayList () para el campo de texto una vez que se ha aplicado el estilo.
Debe llamarse automáticamente cuando se cambia el estilo, pero no ... por alguna razón en flex 3.5 no lo es.
public class TextObject extiende Text {// ... anular la función pública styleChanged (styleProp: String): void {invalidateDisplayList (); } }
Espero que salve a alguien todo el tiempo que perdí en él.
Otros consejos
Según la documentación de Adobe para texto
Dimensionar un control de texto
Flex dimensiona el Control de texto de la siguiente manera:
Si especifica un valor de píxel para ambos las propiedades de alto y ancho, cualquiera texto que excede el tamaño de la el control se recorta en el borde.
Si especifica un píxel explícito ancho, pero sin altura, Flex envuelve el texto para ajustarse al ancho y calcula la altura para ajustarse al número requerido de líneas.
Si especifica un porcentaje basado ancho y sin altura, Flex no ajusta el texto, y la altura es igual el número de líneas según lo determinado por el número de caracteres de retorno.
Si especifica solo una altura y no ancho, el valor de la altura no afectar el cálculo de ancho y Flex dimensiona el control para que se ajuste al ancho de la línea máxima.
Como regla general, si tiene mucho tiempo texto, debe especificar un píxel basado Ancho de propiedad. Si el texto pudiera cambiar y desea asegurarse de que el El control de texto siempre toma lo mismo espacio en su aplicación, establecer propiedades explícitas de altura y anchura que se ajustan al texto esperado más grande.
Entonces, el truco que he usado para tratar esto es hacer que el Texto obtenga su ancho a través de una expresión de enlace desde cualquier contenedor que limite su ancho, generalmente el padre inmediato.
por ejemplo
<mx:Canvas id="box" width="100%" backgroundColor="Red">
<mx:Text width="{box.width}" text="{someReallyLongString}" />
</mx:Canvas>
¿Podría usar un ancho de píxel fijo en lugar de 100%? He tenido problemas con el 100% calculado incorrectamente en los controles de texto dinámico antes.