2011-07-29 11 views
2

私はspark DropDownListsを使用していますが、ドロップダウンリストには水平スクロールバーが表示されません。ドロップダウンがアンカーよりも広いのでOKです。したがって、popUpWidthMatchesAnchorWidthをfalseに設定するカスタムスキンがあります。しかし、私はドロップダウンをアンカーより小さくすることは望ましくありません。これは私のジレンマです。Flex 4.5 - Spark DropDownList - ドロップダウンの最小幅はアンカーの幅です

時にはうまくいく解決策が出てきましたが、問題があります。次のように私のDropDownListの肌は次のとおりです。

<?xml version="1.0" encoding="utf-8"?> 
<s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:fb="http://ns.adobe.com/flashbuilder/2009" alpha.disabled=".5" minHeight="25"> 

    <fx:Metadata> 
    <![CDATA[ 
     [HostComponent("spark.components.DropDownList")] 
    ]]> 
    </fx:Metadata> 

    <fx:Script> 
     <![CDATA[ 
      override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void 
      { 
       // anchor width is the min width of the dropdown 
       if (dropDown && openButton && popUp && dropDown.getExplicitOrMeasuredWidth() < openButton.getExplicitOrMeasuredWidth()) 
        popUp.popUpWidthMatchesAnchorWidth = true; 

       super.updateDisplayList(unscaledWidth, unscaledHeight); 
      } 
     ]]> 
    </fx:Script> 

    <s:states> 
     <s:State name="normal" stateGroups="closed" /> 
     <s:State name="open" /> 
     <s:State name="disabled" stateGroups="closed" /> 
    </s:states> 

    <s:PopUpAnchor id="popUp" displayPopUp.normal="false" displayPopUp.open="true" includeIn="open" 
     left="0" right="0" top="0" bottom="0" itemDestructionPolicy="auto" 
     popUpPosition="below" popUpWidthMatchesAnchorWidth="false"> 

     <s:Group id="dropDown" maxHeight="134" minHeight="22" > 

      <s:RectangularDropShadow id="dropShadow" blurX="20" blurY="20" alpha="0.45" distance="7" 
       angle="90" color="#000000" left="0" top="0" right="0" bottom="0"/> 

      <s:Rect id="border" left="0" right="0" top="0" bottom="0"> 
       <s:stroke> 
        <s:SolidColorStroke id="borderStroke" weight="1"/> 
       </s:stroke> 
      </s:Rect> 

      <s:Rect id="background" left="1" right="1" top="1" bottom="1" > 
       <s:fill> 
        <s:SolidColor color="#222222"/> 
       </s:fill> 
      </s:Rect> 

      <s:Scroller id="scroller" left="0" top="0" right="0" bottom="0" hasFocusableChildren="false" minViewportInset="1"> 
       <s:DataGroup id="dataGroup" itemRenderer="spark.skins.spark.DefaultItemRenderer"> 
        <s:layout> 
         <s:VerticalLayout gap="0" horizontalAlign="contentJustify"/> 
        </s:layout> 
       </s:DataGroup> 
      </s:Scroller> 
     </s:Group> 
    </s:PopUpAnchor> 

    <s:Button id="openButton" left="0" right="0" top="0" bottom="0" focusEnabled="false" alpha.disabled="0.5" 
     skinClass.closed="assets.skins.dropDownList.dropDownListNormalButtonSkin" 
     skinClass.open="assets.skins.dropDownList.dropDownListOpenButtonSkin"/> 

    <s:Label id="labelDisplay" verticalAlign="middle" maxDisplayedLines="1" 
     mouseEnabled="false" mouseChildren="false" 
     left="7" right="30" top="2" bottom="2" width="75" verticalCenter="1" /> 

</s:SparkSkin> 

このドロップダウンの内容があるときに期待どおりに動作のいずれかのアンカーよりも広い約100ピクセルよりも小さいが、私は明示的にDropDownListコントロールのインスタンスへの幅を設定した場合、 200ピクセルのようなもので、ドロップダウンのコンテンツは約150ピクセル幅で、ドロップダウンはアンカーよりも小さくなります。

基本的には、DropDownListの幅を何に設定しているかに関係なく、openButton.getExplicitOrMeasuredWidth()は約100を返します。

これを変更して、幅の異なる複数のDropDownListsを持つことができますが、常にドロップダウンの幅がアンカーの幅以上であることを確認できますか?

+0

あなたは 'openButton.getExplicitOrMeasuredWidth()'の代わりに 'openButton.width'だけを使ってみましたか? – Constantiner

+0

dropDownにはどこかに最小幅が設定されていると思われます。私が推測しなければならなかったら;私はそれがデータグループにあったと言いたい。それはちょうど推測です。実際にこれを行うには、ドロップダウン幅を決める独自のアルゴリズムを作成する必要があります。面倒な作業になるでしょうし、すべてのアイテムを100%完成させる必要があるので効率的ではないと思います。 – JeffryHouser

+0

@ Constantiner - 一息...ええ、それは働いた。彼らは同じではないと私にはばかげているようだが、それは私がそれを過度に複雑にするために得るものだと思う。ドロップダウンの幅を取得するにはgetExplicitOrMeasuredWidthを使う必要があると思うので、同じ値を取得する必要があると思って、もう一方の側でも使用しました。答えとして投稿し、私はそれを受け入れる。 – Travesty3

答えて

2

は私があなたの代わりにopenButton.getExplicitOrMeasuredWidth()openButton.widthを使用することをお勧め。

3

You Said: "DropDownListのインスタンスの幅を明示的に200pxのように設定し、ドロップダウンの内容が約150pxの場合、ドロップダウンはアンカーよりも小さくなります。"

明示的に幅を設定すると、this.widthは常に信頼できるものになります。 button.getExplicitOrMeasuredWidth()をthis.widthに置き換えるだけで問題は解決します。

​​
+0

このソリューションは私にとっても役に立ちます。彼が元の投稿のコメントで最初に答えたので@ Constantinerへの答えを与える。しかし、助けてくれてありがとう! – Travesty3

関連する問題