2009-04-08 63 views
1

文本區域的初始高度遠遠大於內容,我無法找到使其始終與文本內容高度相同的方式:如何獲取mx:textarea高度與內容相同

<mx:TextArea id="textarea" borderStyle="solid" width="100%" wordWrap="true" selectable="false" backgroundAlpha="0" focusAlpha="0" text="this is a little test" /> 

給出一個邊框比所需要的高得多。

如果您在內容中有鏈接,那麼在鏈接無處附近觸發鏈接「鼠標懸停」時,這也會導致一個不明確的問題。

<mx:Script> 
<![CDATA[ 
public function onInit():void 
{ 
    var style:StyleSheet = new StyleSheet(); 

    var aLink:Object = new Object(); 
    aLink.color = "#0000FF"; 

    var aHover:Object = new Object(); 
    aHover.color = "#00FF00"; 
    aHover.textDecoration = "underline"; 

    style.setStyle("a:hover", aHover); 
    style.setStyle("a:link", aLink); 

    textarea.styleSheet = style; 
} 
]]> 
</mx:Script> 


<mx:TextArea id="textarea" width="100%" wordWrap="true" borderStyle="solid" selectable="false" backgroundAlpha="0" focusAlpha="0" > 
    <mx:htmlText> 
    <![CDATA[<a href='event:http://www.adobe.com'>Navigate to Adobe.com.</a> this is testing nothing at all really]]> 
    </mx:htmlText> 
</mx:TextArea> 

Text組件不受此影響,但我無法將樣式表附加到文本組件。

希望有人能幫忙。還是有一些其他的組件可以使用,我可以添加一個樣式表來定位錨標籤。

我發現這個重寫的TextArea.as源,如果我重寫,並刪除了「2×」事半功倍幾乎工程,但不幸的是它意味着內容犯規得到較大時,它需要和垂直滾動代替,所以它幾乎沒有:

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

    measuredMinWidth = DEFAULT_MEASURED_MIN_WIDTH; 
    measuredWidth = DEFAULT_MEASURED_WIDTH; 
    // TextArea is minimum of two lines of text 
    measuredMinHeight = measuredHeight = 2 * DEFAULT_MEASURED_MIN_HEIGHT; 
} 

回答

2

如果你擴展了Text,你可以添加一個getter/setter,它允許你設置底層UITextField對象的styleSheet。

package 
{ 
    import flash.events.Event; 
    import flash.text.StyleSheet; 

    import mx.controls.Text; 

    import mx.core.mx_internal; 

    use namespace mx_internal; 

    public class StyledText extends Text 
    { 
     public function StyledText() 
     { 
      super(); 
     } 

     private var _styleSheet:StyleSheet = null; 

     [Bindable("stylesheetChanged")] 
     public function get styleSheet():StyleSheet { 
      return _styleSheet; 
     } 

     public function set styleSheet(value:StyleSheet):void { 
      _styleSheet = value; 

      if (textField) { 
       textField.styleSheet = _styleSheet; 
      } 

      dispatchEvent(new Event("stylesheetChanged")); 
     } 

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

      //textField is created in the createChildren 
      //method of the Label class 
      if (textField && styleSheet) { 
       textField.styleSheet = _styleSheet; 
      } 
     } 

    } 
} 

然後你可以使用該組件,像這樣:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="*" preinitialize="onInit()"> 
    <mx:Script> 
    <![CDATA[ 
    public function onInit():void 
    { 
     var style:StyleSheet = new StyleSheet(); 

     var aLink:Object = new Object(); 
     aLink.color = "#0000FF"; 

     var aHover:Object = new Object(); 
     aHover.color = "#00FF00"; 
     aHover.textDecoration = "underline"; 

     style.setStyle("a:hover", aHover); 
     style.setStyle("a:link", aLink); 

     text.styleSheet = style; 
    } 
    ]]> 
    </mx:Script> 


    <ns1:StyledText id="text" x="0" y="79"> 
     <ns1:htmlText> 
     <![CDATA[<a href='event:http://www.adobe.com'>Navigate to Adobe.com.</a> this is testing nothing at all really]]> 
     </ns1:htmlText> 
    </ns1:StyledText> 

</mx:Application> 
+0

我喜歡這個主意,但它並沒有真正起作用,textField爲null,所以setter不起作用,可能是因爲它在preInitialised上創建之前創建的。所以我在Event.COMPLETE上設置了樣式,但實際上並沒有設置控件的樣式。 – Dan 2009-04-09 06:19:27

0

基於Bedwyr的鏈接,我想我會嘗試recalcing高度自己,這似乎很好地工作(沒有發現任何不良的副作用還沒有,但也有可能):

this.addEventListener(Event.CHANGE, onReMeasure); 
this.addEventListener(Event.RESIZE, onReMeasure); 

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

     measuredMinWidth = DEFAULT_MEASURED_MIN_WIDTH; 
     measuredWidth = DEFAULT_MEASURED_WIDTH; 

     var lm:TextLineMetrics = getLineMetrics(0); 
     measuredMinHeight = measuredHeight = DEFAULT_MEASURED_MIN_HEIGHT; 
} 

private function onReMeasure(eventObj:Event):void 
{ 
    var ht:Number = 0; 
    for(var n:int = 0; n < textField.numLines; n++) 
    { 
     ht += textField.getLineMetrics(n).height; 
    } 
    ht += 10; // padding 

    height = ht; 
    validateNow(); 
} 
+0

有太多的副作用與此不太提款權和maclema的更新工作這麼從文本傳承,並擁有自己的get/set樣式表是最好的答案 – Dan 2009-04-15 19:30:54