суббота, 5 сентября 2009 г.

wordWrap в Text контроле (Flex)

Дошло дело до изучения Flex, хорош для своего спектра задач. Но как в каждом языке так и здесь возникают ошибки и проблемы, одну из них и захотелось описать в этом посте.

Пришлось помучатся с переносом текста в контроле Text (mx.controls.Text). Добавлял я его следующим образом:

<mx:Text text="...много текста"/>

Проблема заключалась в том что когда количество отображаемого текста превышало ширину внешнего контейнера, то Text контрол устанавливал скойство wordWrap=false и появлялась горизонтальная прокрутка.

Погуглив, нормального решения найти не удалось(гуглозвезды не правильно стояли), одни предлагали реализовать контрол наследником от Text и переопределить некоторую логику, другие реализовать полностью свой контрол. Все это как то было криво и я решил покопаться в исходниках.

Почти сразу я наткнулся на метод.

override protected function commitProperties():void
    {
    super.commitProperties();

    // If explicitWidth or maxWidth or percentWidth changed,
    // set wordWrap appropriately before measuring.
    if (widthChanged)
    {
        textField.wordWrap = !isNaN(explicitWidth) ||
                !isNaN(explicitMaxWidth) ||
                !isNaN(percentWidth);
        widthChanged = false;
    }
}

Все сразу прояснилось, для того что бы избежать ошибок программистов при использовании контрола Text заложили логику которая позволяла отображать текст в случае если текст выходил за видимые рамки внешнего контейнера. А для решения моей проблемы необходимо было всего лишь установить ширину (width="100%").

<x:Text text="...много текста" width="100%"/>
Внимание: необходимо установить размеры для внешних контейнеров что бы текст не сжимало в "бублик".

3 комментария:

  1. Ну и как бы не ошибка это вовсе :)

    ОтветитьУдалить
  2. Да не совсем, в html не будет добавлена прокрутка во внешний контейнер если текст понимаешь ли не влазит по ширине в него. :)

    ОтветитьУдалить