2008-09-19 2 views
1

Я реализовал собственный инструмент визуализации элементов, который я использую с помощью combobox в гибком проекте, над которым я работаю. Он отображает и значок и некоторый текст для каждого элемента. Единственная проблема заключается в том, что когда текст длинный, ширина меню не корректируется должным образом, а текст усекается при отображении. Я попытался настроить все очевидные свойства, чтобы облегчить эту проблему, но не добился успеха. Кто-нибудь знает, как сделать масштаб ширины меню со списком подходящим образом для любых данных, которые он оказывает?Flex: Custom Item Renderer Для элементов управления 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%"/> 

EDIT: поясню на вещи: я могу установить свойство dropdownWidth на combobox к некоторому сколь угодно большому значению - это сделает все подойдет, но оно будет слишком велико. Поскольку данные, отображаемые в этом поле со списком, являются общими, я хочу, чтобы он автоматически определял себя самым большим элементом в датапаравидере (документация по гибкому тексту говорит, что он это сделает, но я чувствую, что мой пользовательский элемент визуализации каким-то образом нарушает это поведение) не

ответ

1

Просто случайная мысль (не ключ, если это поможет):

Попробуйте установить родительскую HBox и ширину этикетки до 100%. Это, как правило, устраняет любые проблемы, с которыми я столкнулся, которые были похожи.

+0

Я пробовал это, но, увы, это не имело никакого эффекта. Единственное, что, по-видимому, влияет на ширину меню, - это длина значения, указанного для свойства «подсказка» в поле со списком. – sgibbons 2008-09-19 18:10:25

0

Вы пробовали использовать метод calculatePreferredSizeFromData()?

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

Этот ответ, вероятно, слишком поздний, но у меня была очень похожая проблема с шириной столбцов DataGrid.

После многого лапши, я решил предварительно визуализировать текст в частном TextField, получить ширину отрисованного текста и явно установить ширину столбца во всех соответствующих событиях типа изменения размера. Немного взлома, но работает достаточно хорошо, если у вас нет много изменяющихся данных.

0

Вы должны сделать две вещи:

  • для текста, используйте mx.controls.Text (который поддерживает перенос текста) вместо mx.controls.Label
  • набор COMBOBOX-х dropdownFactory.variableRowHeight=true - это dropdownFactory, как правило, подкласс списка, и ItemRenderer вы настраиваете на ComboBox является то, что будет использоваться для визуализации каждого элемента в списке

и, не в явном виде не установлен comboBox.dropdownWidth - пусть значение по умолчанию о, f comboBox.widt h используется как раскрывающаяся ширина.

0

Если вы посмотрите на measure методе mx.controls.ComboBase, вы увидите, что выпадающий список вычисляет это measuredMinWidth как сумма ширины текста и ширину кнопки ComboBox.

// 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); 
    } 

calculatePreferredSizeFromData метод упомянутого @defmeta (реализовано в mx.controls.ComboBox) предполагает, что средство визуализации данных является лишь текстовым полем, и использует flash.text.lineMetrics для вычисления ширины текста из поля метки в data объекте. Если вы хотите добавить дополнительный визуальный элемент к визуализации элемента и имеют ComboBox принять его размер во внимание при расчете его собственный размер, то вам придется расширить mx.controls.ComboBox класс и переопределить метод calculatePreferredSizeFromData следующим образом:

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}; 
} 

Если возможно сохранить размеры изображения в объекте данных и использовать эти значения как imgH и imgW, это значительно упростит размер.

EDIT:

Если вы добавляете элементы визуализации, кроме изображения, как ярлык, вы также должны рассчитать их размер, а когда вы перебирать элементы данных и принять эти аспекты во внимание при расчет maxH и maxW.

Смежные вопросы