2

私が取り組んでいるフレックス プロジェクトのコンボボックスで使用しているカスタム アイテム レンダラーを実装しました。各項目のアイコンとテキストが表示されます。唯一の問題は、テキストが長い場合、メニューの幅が適切に調整されず、表示時にテキストが切り捨てられることです。この問題を軽減するために、すべての明らかなプロパティを調整しようとしましたが、成功しませんでした。コンボボックスのメニュー幅を、レンダリングしているデータに合わせて適切にスケーリングする方法を知っている人はいますか?

私のカスタムアイテムレンダラーの実装は次のとおりです。

<?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プロパティを任意の大きな値に設定できます-これによりすべてが収まりますが、幅が広すぎます。このコンボボックスに表示されるデータは一般的なものなので、データプロバイダーの最大の要素に合わせて自動的にサイズを変更したいと考えています (フレックスのドキュメントではこれを行うと書かれていますが、カスタム アイテム レンダラーが何らかの形でその動作を壊していると感じています)。

4

5 に答える 5

1

ただのランダムな考え(これが役立つかどうかの手がかりはありません):

親 HBox とラベルの幅を 100% に設定してみてください。これにより、私が遭遇した同様の問題は通常修正されます。

于 2008-09-19T18:08:43.893 に答える
0

あなたは2つのことをする必要があるでしょう:

  • テキストにmx.controls.Textは、mx.controls.Labelの代わりに(テキストの折り返しをサポートする)を使用します
  • set comboBox's-dropdownFactory.variableRowHeight=trueこのdropdownFactoryは通常Listのサブクラスであり、ComboBoxに設定しているitemRendererは、リスト内の各アイテムをレンダリングするために使用されるものです。

また、明示的に設定しないでくださいcomboBox.dropdownWidth。デフォルト値のcomboBox.widthをドロップダウン幅として使用します。

于 2009-09-16T10:02:55.233 に答える
0

calculatePreferredSizeFromData()メソッドを使用してみましたか?

protected override function calculatePreferredSizeFromData(count:int):Object
于 2008-09-19T18:27:21.260 に答える
0

この答えはおそらく遅すぎますが、DataGrid の列幅に関して非常によく似た問題がありました。

いろいろ考えた結果、プライベート TextField でテキストを事前にレンダリングし、そこからレンダリングされたテキストの幅を取得し、適切なサイズ変更タイプのすべてのイベントで列の幅を明示的に設定することにしました。少しハックですが、変化するデータがあまりない場合は十分に機能します。

于 2008-09-30T21:37:18.190 に答える
0

measureメソッドを見ると、テキストの幅とコンボ ボックス ボタンの幅の合計としてmx.controls.ComboBaseコンボ ボックスが計算されることがわかります。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);
    }

@defmetacalculatePreferredSizeFromDataで言及されているメソッド ( で実装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、サイズ変更がはるかに簡単になります。

編集:

ラベルのように、画像以外のレンダリングに要素を追加する場合、データ要素を反復処理するときにそれらのサイズも計算する必要がmaxHありmaxWます。

于 2009-11-06T16:14:36.680 に答える