Apache flex Flex:Do*对mx:Label或mx:text中的选定文本执行任何操作?

Apache flex Flex:Do*对mx:Label或mx:text中的选定文本执行任何操作?,apache-flex,actionscript-3,flex3,Apache Flex,Actionscript 3,Flex3,Flex的文本编辑控件(mx:TextField,mx:TextArea)提供了对所选文本进行“填充”的功能(selectionBeginIndex,SelectionIndex,setSelection),但文本显示控件(mx:Label,mx:text)似乎没有提供任何类似的功能 经过一些修改,我尝试对Label子类化,然后编写函数,这些函数允许访问底层的TextField实例。。。但即便如此,设置选择也不起作用 function get selectionBeginIndex():int

Flex的文本编辑控件(mx:TextField,mx:TextArea)提供了对所选文本进行“填充”的功能(
selectionBeginIndex
SelectionIndex
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控件中选择的文本?是否有“更好”的控件可供使用?

您最好使用TextInput,将editable属性设置为false,将borderStyle设置为“none”,而不是使用标签

关于文本组件,在某些情况下,这比标签要好一些,因为它允许用户用鼠标选择显示的文本,并且支持多行。但是我不知道你是否可以选择文本程序Maticaly,尽管我怀疑如果你对它进行子类化,你会比使用子类化标签更成功。或者,您可以使用一个与我在TextInput中提到的属性相同的TextArea

要根据文本调整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;
    }
公共重写函数validateProperties():void
{
super.validateProperties();
var tm:TextLineMetrics=this.getLineMetrics(0);
变量txtWidth:uint=tm.width+tm.leading+10;
this.width=minWidth
该“10”值可能需要根据您可能使用的字体进行更改。
如果您也需要在键入时调整TextInput的大小,则需要侦听其更改事件并从处理程序调用validateProperties。

您最好使用TextInput,将editable属性设置为false,将borderStyle设置为“无”,而不是使用标签

关于文本组件,在某些情况下,这比标签要好一些,因为它允许用户用鼠标选择显示的文本,并且支持多行。但是我不知道你是否可以选择文本程序Maticaly,尽管我怀疑如果你对它进行子类化,你会比使用子类化标签更成功。或者,您可以使用一个与我在TextInput中提到的属性相同的TextArea

要根据文本调整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;
    }
公共重写函数validateProperties():void
{
super.validateProperties();
var tm:TextLineMetrics=this.getLineMetrics(0);
变量txtWidth:uint=tm.width+tm.leading+10;
this.width=minWidth
该“10”值可能需要根据您可能使用的字体进行更改。
如果在键入时也需要调整TextInput的大小,则需要侦听其更改事件并从处理程序调用validateProperties。

您可能需要使用UITextField,flash TextField的flex版本。这是文本区域内用于显示文本的对象。它支持您正在查找的索引


请注意,样式有点怪异。“setStyle”什么都不做。您必须重写validateNow函数才能使用setTextFormat,否则,您的设置将被删除。我不知道如何使用CSS,但那在当时不是一个问题

您可能需要使用UITextField,flash TextField的flex版本。这是文本区域内用于显示文本的对象。它支持您正在查找的索引


请注意,样式有点怪异。“setStyle”什么都不做。您必须重写validateNow函数才能使用setTextFormat,否则,您的设置将被删除。我不知道如何使用CSS,但那在当时不是一个问题

我曾经考虑过使用文本输入技巧。。。感谢您确认它将实际工作。还有,你呢。子类化文本VS标签:文本是标签的子类,您可以通过设置“selective='true'”使标签可选。不过,遗憾的是,对文本进行子类化也没有多大帮助:(尽管如此,我想使用文本的原因是它会增长到适合其输入,而TextInput不会(除非我在阅读有关文本的文章时错过了某种方法)+1标签是用来标记其他控件的,在某种程度上不是交互式元素。是的,我对文本不好。我忘了它继承了标签。我在答案中添加了代码,可以根据文本调整TextInput子类的大小。我曾考虑过使用TextInput技巧…感谢您确认它确实可以工作。还有,关于.subclass分类文本VS标签:文本是标签的一个子类,您可以通过设置“selective='true'”使标签可选择。然而,遗憾的是,分类文本也没有多大帮助:(尽管如此,我想使用文本的原因是它会增长到适合其输入,而TextInput不会(除非我在阅读有关文本的文章时错过了某些方法)+1标签用于标记其他控件,在某种程度上不是交互式元素。是的,我对文本不好。我忘了它继承了标签。我在答案中添加了代码,可用于根据文本调整TextInput子类的大小。