Flex - Как изменить высоту открытого DropDownList - PullRequest
15 голосов
/ 18 февраля 2010

Используя FB4, я хочу изменить высоту открытой искры DropDownList.По умолчанию отображается до 6 элементов перед прокруткой.Мой раскрывающийся список содержит 7 элементов, поэтому я хочу изменить высоту раскрывающегося списка, чтобы он соответствовал всем 7 элементам без прокрутки.В качестве обходного пути я изменил размер шрифта элементов, чтобы они были меньше и все 7 подходили, но шрифт меньшего размера выглядит не очень хорошо.Есть ли способ изменить эту высоту?Я довольно новичок во Flash, поэтому, если это сложное решение, пожалуйста, будьте подробны: -).

Ответы [ 5 ]

17 голосов
/ 17 августа 2011

Не проще ли, если вы используете свойство selectedRowCount объекта verticalLayout?

<s:DropDownList dataProvider="{myDataProvider}">
    <s:layout>
        <s:VerticalLayout requestedRowCount="10"/>
    </s:layout>
</s:DropDownList>
16 голосов
/ 20 февраля 2010

Проблема в том, что во Flex 4 DropDownListSkin определил maxHeight="134" для обложки по умолчанию, которую вы, вероятно, используете.Это заставляет полосу прокрутки появляться, если объекты растягиваются за пределы этой высоты.Все, что вам нужно сделать, это скопировать / вставить их код DropDownListSkin в пользовательский скин и применить его к вашему DropDownList через CSS:

VariableHeightDropDownListSkin

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

    <!-- host component -->
    <fx:Metadata>
    <![CDATA[ 
        /** 
         * @copy spark.skins.spark.ApplicationSkin#hostComponent
         */
        [HostComponent("spark.components.DropDownList")]
    ]]>
    </fx:Metadata> 

    <s:states>
        <s:State name="normal" />
        <s:State name="open" />
        <s:State name="disabled" />
    </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="true">

        <!-- removed maxHeight! -->
        <s:Group id="dropDown" minHeight="22">
            <!-- border/fill -->
            <s:Rect left="0" right="0" top="0" bottom="0">
                <s:stroke>
                    <s:SolidColorStroke color="0x5380D0" />
                </s:stroke>
                <s:fill>
                    <s:SolidColor color="0xFFFFFF" />
                </s:fill>
            </s:Rect>

            <s:Scroller left="0" top="0" right="0" bottom="0" focusEnabled="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:filters>
                <s:DropShadowFilter blurX="20" blurY="20" distance="7" angle="90" alpha="0.45" color="0x6087CC" />
            </s:filters>
        </s:Group>
    </s:PopUpAnchor>

    <s:Button id="openButton" left="0" right="0" top="0" bottom="0" focusEnabled="false"
        skinClass="spark.skins.spark.DropDownListButtonSkin" />
    <s:Label id="labelDisplay" verticalAlign="middle" lineBreak="explicit"
        mouseEnabled="false" mouseChildren="false"
        left="7" right="30" top="2" bottom="2" width="75" verticalCenter="1" /> 

</s:Skin>

Пример приложения

<?xml version="1.0" encoding="utf-8"?>
<s:Application
    xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flex/spark"
    xmlns:mx="library://ns.adobe.com/flex/mx">

    <fx:Style>
        @namespace mx "library://ns.adobe.com/flex/mx";
        @namespace s "library://ns.adobe.com/flex/spark";

        s|DropDownList
        {
            skinClass: ClassReference("VariableHeightDropDownListSkin");
        }
    </fx:Style>

        <s:DropDownList labelField="name" horizontalCenter="0" verticalCenter="0">
            <s:layout>
                <s:VerticalLayout requestedRowCount="7"/>
            </s:layout>
            <s:dataProvider>
                <mx:ArrayCollection>
                    <fx:Object name="one"/>
                    <fx:Object name="two"/>
                    <fx:Object name="three"/>
                    <fx:Object name="four"/>
                    <fx:Object name="five"/>
                    <fx:Object name="six"/>
                    <fx:Object name="seven"/>
                </mx:ArrayCollection>
            </s:dataProvider>
        </s:DropDownList>

</s:Application>

Дайте мне знать, если это поможет, Лэнс

9 голосов
/ 03 августа 2010

Ответ viatropos будет работать, однако вы должны стараться избегать переопределения всей кожи в максимально возможной степени.

В этом случае вы заметите, что в коде Viatropos VariableHeightDropDownListSkin для группы, в которой он удалил атрибут maxHeight, также указан указанный «id».

Теперь посмотрите документацию для DropDownList, и вы заметите в разделе SkinParts, что есть часть скина «dropDown». На самом деле это свойство DropDownList.

Таким образом, вместо переопределения скина вы можете просто использовать actioncript (здесь я использую UIComponent.DEFAULT_MAX_HEIGHT, но вы можете использовать все, что пожелаете):

(MyDropDownList.dropDown as UIComponent).maxHeight = UIComponent.DEFAULT_MAX_HEIGHT;
2 голосов
/ 19 февраля 2010

К сожалению, во Flex 4 это намного сложнее, чем во Flex 3:

Вы должны быть в состоянии определить макет для DropDownList с более высокими requestedRowCount ( подробностями здесь), но для> 6 строк необходимо выполнить больше работы ( Flex, выпуск SDK-25364 ).

1 голос
/ 18 февраля 2010

в FB3 это rowCount, потому что выпадающий список является потомком элемента управления списком. FB4, вероятно, похож.

myDropdown.rowCount = 7;

Я обычно использую что-то более похожее на

myDropdown.rowCount = myDataProvider.lenght();
...