Flex: сделать * что-нибудь * с выделенным текстом в формате mx: Label или mx: Text? - PullRequest
1 голос
/ 19 июня 2009

Элементы управления Flex для редактирования текста (mx: TextField, mx: TextArea) предлагают функции для выполнения «работы» с выделенным текстом (selectionBeginIndex, selectionEndIndex, setSelection), но с элементами управления отображением текста (mx : Label, mx: Text) не предлагает ничего подобного.

После некоторой обработки я попытался создать подкласс Label, а затем написать функции, которые предоставляют доступ к базовому экземпляру TextField ... Но даже тогда установка выбора не сработала!

function get selectionBeginIndex():int {
    // This works
    return this.textField.selectionBeginIndex;
}

function get selectionEndIndex():int {
    // This works
    return this.textField.selectionEndIndex;
}

function setSelection(beginIndex:int, endIndex:int):void {
    // But this has no effect!
    this.textField.setSelection(beginIndex, endIndex);
}

Итак, есть ли лучший способ получить доступ / изменить текст, выбранный в элементах управления mx: Label и mx: Text? Есть ли "лучшие" элементы управления для использования?

Ответы [ 2 ]

4 голосов
/ 19 июня 2009

Возможно, вам лучше использовать TextInput с изменяемым свойством, установленным на false, и для borderStyle вместо «Label» вместо «Label».

Что касается компонента «Текст», то в некоторых ситуациях это немного лучше, чем «Метка», поскольку он позволяет пользователю выбирать отображаемый текст с помощью мыши и поддерживает несколько строк. Но я не знаю, можете ли вы выделить текст программно, хотя я подозреваю, что если вы вложите его в подкласс, у вас будет больший успех, чем с подклассом Label. В качестве альтернативы вы можете использовать TextArea с теми же свойствами, которые я упоминал для TextInput.

Чтобы изменить размер TextInput на основе его текста, вы можете переопределить метод validateProperties и использовать getLineMetrics () для вычисления необходимой ширины:

    public override function validateProperties():void
    {
        super.validateProperties();
        var tm : TextLineMetrics = this.getLineMetrics(0);
        var txtWidth : uint = tm.width + tm.leading + 10;
        this.width = minWidth < txtWidth ? txtWidth : minWidth;
    }

Это значение "10" может потребоваться для изменения в зависимости от используемого вами шрифта. Если вам нужно, чтобы TextInput изменял размер при вводе текста, вам нужно прослушать его событие изменения и вызвать validateProperties из обработчика.

1 голос
/ 23 июня 2009

Возможно, вы захотите использовать UITextField, гибкую версию Flash TextField. Это объект, используемый внутри TextArea для отображения текста. Он поддерживает те индексы, которые вы ищете.

Имейте в виду, что стилизация немного странная. "setStyle" ничего не делает. И вы должны переопределить функцию validateNow, чтобы использовать setTextFormat, в противном случае ваши настройки будут уничтожены. Я не уверен, как использовать CSS с этим, но это не было проблемой в то время.

...