2009-06-17 67 views
1

我有一个自定义组件,基本上是VBoxLabelTextField不包括组件大小的尺寸

<mx:VBox width="50%"> 
    <mx:Label width="100%"/> 
    <mx:TextField width="100%"/> 
</mx:VBox> 

我想要什么,基本上是有两个这样的VBox ES的奠定了在HBox和各会采取整整50% - 他们的孩子LabelTextField应该只是服从这一点。

如果我同时设置LabelTextField的宽度为100%,而Label文本不适合,默认行为是要扩大VBox宽度 - 我不希望这样的事情发生。 TextField应该始终占据宽度的100%,并且我希望Label明确设置为TextField的宽度,因此文本将被截断并且不会扩大VBox宽度。

有没有办法告诉标签只是服从VBox(或TextField)宽度,而不是包含在VBox宽度的测量?

不知道我是否清楚。 :) 在此先感谢。

回答

1

这并不像我想的那么容易。在开始时,我想建议maxWidth,但它不能正确使用标签。不过我只是测试这一点:

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"> 
    <mx:Script> 
     <![CDATA[ 
      import mx.controls.TextInput; 
      import mx.controls.Label; 
      private function onTextChanged(event:Event):void { 
       var currentText:String = TextInput(event.target).text; 
       var shortened:Boolean = false; 
       // adding 30 to leave some space for ... 
       while (lbl.measureText(currentText).width > (lbl.width-30)) { 
        currentText = currentText.substr(0,currentText.length-1); 
        shortened = true; 
       } 
       lbl.text = currentText + ((shortened) ? "..." : ""); 
      } 
     ]]> 
    </mx:Script> 
    <mx:VBox width="50%"> 
     <mx:Label id="lbl" width="100%" /> 
     <mx:TextInput width="100%" change="onTextChanged(event);" /> 
    </mx:VBox> 
</mx:WindowedApplication> 

它可能不被写入的方式(只是归因),你预期,但它确实你需要什么。 如果这不是一个解决方案,您可以考虑按以下方式扩展标签。 克里特岛的自定义标签:

radekg/MyLabel.as

package radekg { 
    import mx.controls.Label; 

    public class MyLabel extends Label { 
     public function MyLabel() { 
      super(); 
     } 

     private var _myText:String; 

     override public function get text():String { 
      return _myText; 
     } 

     override public function set text(value:String):void { 
      if (value != null && initialized) { 
       // store the copy so the getter returns original text 
       _myText = value; 
       // shorten: 
       var shortened:Boolean = false; 
       while (measureText(value).width > (width-30)) { 
        value = value.substr(0,value.length-1); 
        shortened = true; 
       } 
       super.text = value + ((shortened) ? "..." : ""); 
      } 
     } 
    } 
} 

而且使用这样的:

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" 
    xmlns:controls="radekg.*"> 
    <mx:VBox width="50%"> 
     <controls:MyLabel width="100%" id="lbl" text="{ti.text}" /> 
     <mx:TextInput width="100%" id="ti" /> 
     <mx:Button label="Display label text" click="mx.controls.Alert.show(lbl.text)" /> 
    </mx:VBox> 
</mx:WindowedApplication> 

这可以简单地结合使用。一旦你在文本输入中输入非常长的文本并且标签显示...点击按钮。你会注意到text()getter返回原始文本。

希望这会有所帮助。