He implementado un elemento personalizado representador que estoy usando con un combobox en un proyecto de flex en el que estoy trabajando. Muestra y el icono y texto para cada elemento. El único problema es que cuando el texto es largo, el ancho del menú no está ajustado correctamente y el texto se trunca cuando se muestra. He tratado de ajustar todos los de la obvia propiedades para aliviar este problema, pero no han tenido ningún éxito. ¿Alguien sabe cómo hacer para que el combobox menú de ancho escala adecuadamente a los datos es la representación?

Mi costumbre representador de elemento de aplicación es:

<?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>

Y mi combobox usa así:

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

EDITAR:
Debo aclarar una cosa: puedo configurar el dropdownWidth de la propiedad en el control combobox para algunos arbitrariamente gran valor – esto va a hacer que todo encaje, pero va a ser demasiado amplia. Puesto que los datos que se muestran en este combobox es genérico, quiero que automáticamente el tamaño de la misma para el elemento más grande en el dataprovider (el flex de la documentación dice que va a hacer esto, pero tengo la sensación de que mi elemento personalizado representador de alguna manera es romper ese comportamiento)

InformationsquelleAutor sgibbons | 2008-09-19

5 Comentarios

  1. 1

    Sólo un pensamiento al azar (ni idea de si esto va a ayudar):

    Trata de ajustar el padre HBox y la Etiqueta de la anchos de hasta el 100%. Que generalmente se fija problemas me he topado con que fueron similares.

    • He intentado eso pero, por desgracia – que no ha tenido ningún efecto. La única cosa que parece efecto de la anchura del menú es la longitud del valor especificado para el «símbolo del sistema» de la propiedad en el combobox.
  2. 0

    Has probado a utilizar el calculatePreferredSizeFromData() método?

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

    Esta respuesta es probablemente demasiado tarde, pero tuve un gran problema similar con el DataGrid del ancho de la columna.

    Después de mucho transformada en virutas, me decidí a realizar un procesamiento previo de mi texto en un campo de texto, obtener el ancho de la representación de texto de eso, y establecer de forma explícita el ancho de la columna en todos los redimensionar tipo de eventos. Un poco de hack-y pero funciona bastante bien si no tienes un montón de cambiar los datos.

  4. 0

    Que necesita hacer dos cosas:

    • para el texto, use mx.controls.Text (que admite el ajuste de texto) en lugar de mx.controles.Etiqueta
    • conjunto comboBox del dropdownFactory.variableRowHeight=true — este dropdownFactory normalmente es una subclase de la Lista, y el itemRenderer que se ajuste en el ComboBox es lo que va a ser utilizado para representar cada elemento de la lista

    Y, no se establece explícitamente comboBox.dropdownWidth, deje el valor predeterminado de comboBox.width se utiliza como el desplegable de ancho.

  5. 0

    Si usted mira la measure método de mx.controls.ComboBase, verás que el comboBox calcula es measuredMinWidth como una suma de la anchura del texto y el ancho del botón de 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);
        }

    La calculatePreferredSizeFromData método mencionado por @defmeta (implementado en mx.controls.ComboBox) se supone que el representador de datos es sólo un campo de texto, y utiliza flash.text.lineMetrics para calcular el ancho de texto de la etiqueta de campo en la data objeto. Si desea agregar un elemento visual para el representador de elemento y tienen la ComboBox tomar es el tamaño en cuenta a la hora de calcular su propio tamaño, tendrá que ampliar la mx.controls.ComboBox clase y reemplazar el calculatePreferredSizeFromData método así:

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

    Si es posible almacenar las dimensiones de la imagen en el objeto de datos y el uso de esos valores como imgH y imgW, que hará de tamaño mucho más fácil.

    EDICIÓN:

    Si usted está agregando elementos para el procesamiento, además de una imagen, como una etiqueta, usted también tendrá que calcular su tamaño así cuando se itera a través de los elementos de datos y de tomar esas dimensiones en cuenta a la hora de calcular maxH y maxW.

Dejar respuesta

Please enter your comment!
Please enter your name here