2008-09-19 4 views
1

저는 작업중인 flex 프로젝트에서 콤보 상자와 함께 사용하는 사용자 정의 항목 렌더러를 구현했습니다. 그것은 각 항목에 대한 아이콘과 텍스트를 표시합니다. 유일한 문제는 텍스트가 길면 메뉴의 너비가 제대로 조정되지 않고 텍스트가 표시 될 때 잘려나 간다는 것입니다. 이 문제를 해결하기 위해 모든 명백한 속성을 조정 해 보았지만 성공하지 못했습니다. 누구든지 렌더링하는 데이터에 상관없이 콤보 상자의 너비를 적절하게 조절하는 방법을 알고 있습니까?Flex : 사용자 정의 항목 렌더러 Combobox 컨트롤의 경우 텍스트가 잘립니다.

<?xml version="1.0" encoding="utf-8"?> 
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" 
    styleName="plain" horizontalScrollPolicy="off"> 

    <mx:Image source="{data.icon}" /> 
    <mx:Label text="{data.label}" fontSize="11" fontWeight="bold" truncateToFit="false"/> 

</mx:HBox> 

그리고 내 콤보는 너무처럼 사용 :

내 사용자 정의 항목 렌더러 구현은

<mx:ComboBox id="quicklinksMenu" change="quicklinkHandler(quicklinksMenu.selectedItem.data);" click="event.stopImmediatePropagation();" itemRenderer="renderers.QuickLinkItemRenderer" width="100%"/> 

편집 : 나는에 dropdownWidth 속성을 설정할 수 있습니다 : 나는 일에 명확히해야한다 콤보 박스를 임의의 큰 값으로 설정하십시오. 이렇게하면 모든 것을 적합하게 만들지 만 너무 넓어집니다. 이 콤보 상자에 표시되는 데이터는 일반이기 때문에 데이터 공급자의 가장 큰 요소에 맞게 자동으로 크기를 조정해야합니다 (flex 설명서에서이 작업을 수행 할 것이라고 말했지만 사용자 정의 항목 렌더러가 어떻게 든 해당 동작을 중단한다는 느낌이 들었습니다)

답변

1

그냥 임의의 생각 (이 도움이 될 것입니다 경우 단서 없음) :

100 %로 부모 HBox의 및 레이블의 폭을 설정하십시오. 일반적으로 그와 비슷한 문제는 해결되었습니다.

+0

나는 그것을 시도했지만 슬프 도다. 아무런 효과가 없었다. 메뉴의 너비에 영향을주는 것만이 콤보 박스의 "프롬프트"속성에 지정된 값의 길이입니다. – sgibbons

0

calculatePreferredSizeFromData() 메서드를 사용해 보셨습니까?

protected override function calculatePreferredSizeFromData(count:int):Object 
0

이 답변은 아마도 너무 늦었지만 DataGrid의 열 너비와 매우 비슷한 문제가있었습니다.

많이 먹은 후 개인 텍스트 필드에서 텍스트를 미리 렌더링하고 렌더링 된 텍스트의 너비를 가져 와서 모든 적절한 크기 조정 유형 이벤트에서 열 너비를 명시 적으로 설정하기로 결정했습니다. 약간의 해킹 -하지만 당신은 많은 변화하는 데이터를 가지고 있지 않다면 충분히 잘 작동합니다.

0

당신은 두 가지해야 할 것 : -이 dropdownFactory가 일반적이며, 텍스트에

  • mx.controls.Text를 사용는
  • 세트 콤보 상자의 dropdownFactory.variableRowHeight=true 대신 mx.controls.Label의의 (즉, 텍스트 줄 바꿈 지원) 기본값 O를하자 - 목록의 서브 클래스, 당신은 콤보 상자에 설정하고있는 itemRenderer를이 목록에

을 각 항목을 렌더링하는 데 사용되며, 명시 적으로 comboBox.dropdownWidth를 설정하지 않은 것입니다 f comboBox.widt h를 드롭 다운 폭으로 사용하십시오.

0

메서드가 mx.controls.ComboBase 인 경우 comboBox는 텍스트의 너비와 comboBox 버튼의 너비의 합계가 measuredMinWidth 인 것으로 계산됩니다.

// Text fields have 4 pixels of white space added to each side 
    // by the player, so fudge this amount. 
    // If we don't have any data, measure a single space char for defaults 
    if (collection && collection.length > 0) 
    { 
     var prefSize:Object = calculatePreferredSizeFromData(collection.length); 

     var bm:EdgeMetrics = borderMetrics; 

     var textWidth:Number = prefSize.width + bm.left + bm.right + 8; 
     var textHeight:Number = prefSize.height + bm.top + bm.bottom 
        + UITextField.TEXT_HEIGHT_PADDING; 

     measuredMinWidth = measuredWidth = textWidth + buttonWidth; 
     measuredMinHeight = measuredHeight = Math.max(textHeight, buttonHeight); 
    } 

(mx.controls.ComboBox 구현) @defmeta으로 언급 calculatePreferredSizeFromData 방법은 데이터 렌더링 단지 텍스트 필드 인 것으로 가정하며 data 객체 레이블 필드로부터 텍스트의 폭을 계산 flash.text.lineMetrics를 이용한다. 이 아이템 렌더러에 추가 시각적 요소를 추가하고 싶은 경우는, 그렇게 같은 calculatePreferredSizeFromData 방법을 mx.controls.ComboBox 클래스를 확장하고 재정의 자신의 크기가 윌의 계산할 때 ComboBox 계정으로 크기입니다 걸릴 :

override protected function calculatePreferredSizeFromData(count:int):Object 
    { 
     var prefSize:Object = super.calculatePrefferedSizeFromData(count); 
     var maxW:Number = 0; 
     var maxH:Number = 0; 
     var bookmark:CursorBookmark = iterator ? iterator.bookmark : null; 
     var more:Boolean = iterator != null; 

     for (var i:int = 0 ; i < count ; i++) 
     { 
      var data:Object; 
      if (more) data = iterator ? iterator.current : null; 
      else data = null; 
      if(data) 
      { 
       var imgH:Number; 
       var imgW:Number; 

       //calculate the image height and width using the data object here 

       maxH = Math.max(maxH, prefSize.height + imgH); 
       maxW = Math.max(maxW, prefSize.width + imgW); 
      } 
      if(iterator) iterator.moveNext(); 
     } 

     if(iterator) iterator.seek(bookmark, 0); 
     return {width: maxW, height: maxH}; 
} 

가능하면 데이터 객체에 이미지 크기를 저장하고 그 값을 imgHimgW으로 사용하면 크기를 훨씬 쉽게 조정할 수 있습니다.

편집 :

당신은에 요소를 추가하는 경우 이미지 외에, 라벨처럼, 당신은 또한 데이터 요소를 통해뿐만 아니라 당신이 반복되면 자신의 크기를 계산 및 계정 경우에 그 차원을해야합니다 렌더링 maxHmaxW을 계산하십시오.