2009-02-06 118 views
3

首先,我對此問題中的任何含糊不清表示歉意。在這一點上,我只是試圖獲得一些新的想法來嘗試診斷這個錯誤。Flex截斷按鈕標籤

無論如何,我遇到的問題是使用自定義模塊加載器的應用程序。該模塊加載器已被編譯爲一個swc,模塊加載器正在通過其名稱空間實例化。這一切都很好。我遇到的問題特定於在模塊中使用的mx:按鈕控件。無論什麼原因,他們的標籤被截斷,所以,例如,登錄顯示省略號,因爲符號...

經過相當多的鬼混後,我已經能夠建立以下:

  1. 這個問題似乎只發生在模塊內。如果在主mxml中使用按鈕控件,則標籤不會被截斷。
  2. 其標籤被截斷的按鈕控件沒有指定寬度(將寬度設置爲100%或特定像素寬度無法解決問題)
  3. 按鈕控件正在使用默認填充(與通過將左右設置爲5或任何其他值來填充也沒有幫助)。
  4. 我們沒有使用任何嵌入字體,所以我也認爲這是可能的。
  5. mx:CheckBox和mx:LinkBut​​ton同樣受這個問題影響,雖然mx:CheckBox也似乎不想顯示它的複選框,它只是顯示被截斷的標籤。

這種潛在的副作用是將數據提供者附加到mx:ComboBox會導致組合框控件拋出繪圖錯誤,但我不完全確定它與上述問題有關。

我在查看答案時發現了一個有趣的事情,那就是提及fontContext及其與IFlexModuleFactory的關係。在我們的moduleloader實現中沒有關於fontContext的規範,所以我不完全確定這是否是問題所在。無論如何,如果有人有任何想法,將非常感激。另一方面,如果你確切地知道什麼使我感到困擾,並能給我一個答案,我可能會興奮地讓自己沾沾自喜。晚了。我累了。我需要我的Flex應用程序打好。

由於提前,

--Anne

編輯:爲了澄清什麼我正在尋找這個問題,我真的只需要知道以下幾點:

  1. 這個問題可能是由命名空間衝突引起的嗎?
  2. 如果沒有實現CSS,還有什麼可以覆蓋標籤的默認行爲?
  3. 有沒有人在使用moduleloader的自定義實現時遇到繼承丟失的問題?
  4. 有沒有人遇到過這個問題或者有沒有使用moduleloader的類似問題?

我沒有與這個問題共享任何代碼,只是因爲我必須共享整個應用程序,不幸的是,我不能這樣做。再一次,我並不是在尋找最終的結局,而是所有的解決方案,只是一些建議,如果有人有任何想法,請留意。

+0

你可能將不得不共享代碼爲我們是任何幫助。這可能嗎? – 2009-02-06 03:04:00

回答

5

我一直在處理這個問題,一年之內,我以各種形式處理這個問題,雖然我還沒有弄清楚是什麼導致了這個問題,但顯然有一個錯誤發生在沿線某處。

但是我已經能夠解決這個問題了,主要是通過繼承按鈕類型的控件(在我的例子中爲Button,LinkBut​​ton,PopUpButton等),並將它們的textField成員實例分配給擴展的UITextField其truncateToFit元素只在所有情況下返回false:

public class NonTruncatingUITextField extends UITextField 
{ 
    public function NonTruncatingUITextField() 
    { 
     super(); 
    } 

    override public function truncateToFit(s:String = null):Boolean 
    { 
     return false; 
    } 
} 

自定義組件只是擴展按鈕(或任何其他按鍵式控制是罪魁禍首 - 我已經創建了一個半打左右的這些我自己,每種類型的控件一個),但使用NonTruncatingTextField作爲其標籤,由組件用戶指定:

public class NonTruncatingButton extends Button 
{ 
    private var _truncateLabel:Boolean; 

    public function NonTruncatingButton() 
    { 
     super(); 

     this._truncateLabel = true; 
    } 

    override protected function createChildren():void 
    { 
     if (!textField) 
     { 
      if (!_truncateLabel) 
       textField = new NonTruncatingUITextField(); 
      else 
       textField = new UITextField(); 

      textField.styleName = this; 

      addChild(DisplayObject(textField)); 
     } 

     super.createChildren(); 
    } 

    [Inspectable] 
    public function get truncateLabel():Boolean 
    { 
     return this._truncateLabel; 
    } 

    public function set truncateLabel(value:Boolean):void 
    { 
     this._truncateLabel = value;  
    } 
} 

...所以後來終於,在你的MXML代碼,你正是如此引用自定義組件(在這種情況下,我說的是控制從來沒有截斷其標籤):

<components:NonTruncatingButton id="btn" label="Click This" truncateLabel="false" /> 

我同意這感覺就像一個解決方法,組件架構應該更加優雅地處理所有這些,而且這可能是我們都忽略的一些東西,但它很有用;希望它可以在您尋找更確定的解決方案時解決您的問題。 (雖然個人,我現在使用它,我已經轉移到其他的東西 - 時間更好地花在其他地方!)

祝你好運 - 讓我知道它是如何工作的。

+0

非常感謝您的解決方法。到目前爲止,我們並不需要它,但這完全是因爲我們完全重新定製了我們的自定義moduleLoader實現。不過,我們仍然在更高分辨率(1600x900)下遇到截斷標籤,所以這絕對是一個奇怪的指標問題。 – 2009-02-09 16:46:07

0

我已經使用了自定義按鈕和鏈接按鈕類的解決方案,但仍然遇到問題 - 但找到了一種解決方法,每次都適用於我。

創建一個包含要用於標籤的字體的CSS樣式。請務必在文本選擇下拉列表中選中「嵌入此字體」。回去並將樣式應用到你的按鈕(或者你的自定義按鈕,取決於你對這個特定牆壁抨擊多久),瞧!

還是應該瞧......

0

我已經有一些成功阻止Flex的錯誤按鈕標籤截斷通過設置將labelPlacement到「底」,如:

theButton.labelPlacement = ButtonLabelPlacement.BOTTOM; 

設置標籤位置似乎並沒有幫助阻止在一些更大的按鈕尺寸截斷,但在很多情況下,它適用於我。

如果您不能使用底部對齊的按鈕標籤(例如當您的按鈕具有水平對齊的圖標時),janusz的方法似乎也可以使用。這裏是在ActionScript版本雅努什的重新分配的.text技術,而不是MXML:

theButton.addEventListener(FlexEvent.UPDATE_COMPLETE, function (e:FlexEvent):void { 
    e.target.mx_internal::getTextField().text = e.target.label; 
}); 

前面的代碼需要用戶導入mx_internal和FlexEvent第一,具體如下: 進口mx.events.FlexEvent; 導入mx.core。mx_internal;

而且這裏的結果...

之前(注截斷儘管有大量的橫向空間):

enter image description here

後:

enter image description here

唯一的缺點這種方法你失去了省略號,但在我的情況下,我認爲這是一個受歡迎的功能。

0

我只是遇到了這個問題,解決這個問題是這樣的:

<mx:LinkButton label="Some label" 
    updateComplete="event.target.mx_internal::getTextField().text = event.target.label" 
/>;