1

カスタムアイテムレンダラーを備えたコンボボックスを使用しています。各アイテムには、対応するアイテムをリストから削除するための「削除」ボタンが含まれています。問題は、このボタンをクリックするとコンボボックスのポップアップが自動的に閉じることです。ボタンをクリックしたときにコンボボックスを強制的に開いたままにするにはどうすればよいですか?

これが私のComboBoxの宣言方法です:

<s:ComboBox id="addressIn" width="150" height="23" skinClass="maincomponents.ServerAddressComboBoxSkin" dataProvider="{this._servers}" enabled="true" enabled.loading="false" />

対応するスキン:

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

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

    <!--
        NOTE: this skin file contains sub-parts that may continue to react to
        Style code.  To remove this behavior create new copies of those skins
        and remove the styles.
    -->
    <s:states>
        <s:State name="normal" />
        <s:State name="open" />
        <s:State name="disabled" />
    </s:states>

    <!--- 
        The PopUpAnchor control that opens the drop-down list. 

        <p>In a custom skin class that uses transitions, set the 
        <code>itemDestructionPolicy</code> property to <code>none</code>.</p>
    -->
    <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">

        <!--- 
            This includes borders, background colors, scrollers, and filters. 
            @copy spark.components.supportClasses.DropDownListBase#dropDown
        -->
        <s:Group id="dropDown">

            <!-- drop shadow -->
            <!--- @private -->
            <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"/>

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

            <!-- fill -->
            <!--- Defines the appearance of drop-down list's background fill. -->
            <s:Rect id="background" left="1" right="1" top="1" bottom="1" >
                <s:fill>
                    <!---  
                        @private
                        The color of the drop down's background fill.
                        The default color is 0xFFFFFF.
                    -->
                    <s:SolidColor id="bgFill" color="0xFFFFFF" />
                </s:fill>
            </s:Rect>

            <!--- @private -->
            <s:Scroller id="scroller" left="0" top="0" right="0" bottom="0" horizontalScrollPolicy="off" skinClass="fbcomponents.skinScrollSettingsDD">
                <!--- @copy spark.components.SkinnableDataContainer#dataGroup-->
                <s:DataGroup id="dataGroup" clipAndEnableScrolling="true" itemRenderer="maincomponents.DataList_ServerRepeatedItem">
                    <s:layout>
                        <s:VerticalLayout gap="0" horizontalAlign="contentJustify" requestedMinRowCount="1" requestedMaxRowCount="6"/>
                    </s:layout>
                </s:DataGroup> 
            </s:Scroller>

        </s:Group>
    </s:PopUpAnchor>

    <!---  The default skin is ComboBoxButtonSkin. 
            @copy spark.components.supportClasses.DropDownListBase#openButton
            @see spark.skins.spark.ComboBoxButtonSkin -->
    <s:Button id="openButton" width="20" right="0" top="0" bottom="0" focusEnabled="false"
              skinClass="maincomponents.ServerAddressComboBoxButtonSkin" tabEnabled="false" />  
    <!--- @copy spark.components.ComboBox#textInput -->
    <s:TextInput id="textInput" enabled.disabled="false"
                 left="0" right="19" top="0" bottom="0" 
                 skinClass="maincomponents.ServerAddressComboBoxTextInputSkin"/> 

</s:SparkSkin>

そしてアイテムレンダラー:

<s:ItemRenderer xmlns:s="library://ns.adobe.com/flex/spark"
                xmlns:fx="http://ns.adobe.com/mxml/2009"
                xmlns:fc="http://ns.adobe.com/flashcatalyst/2009"
                xmlns:ai="http://ns.adobe.com/ai/2009"
                xmlns:d="http://ns.adobe.com/fxg/2008/dt" dataChange="onDataChangeHandler(event)" valueCommit="adaptBg()"
                xmlns:flm="http://ns.adobe.com/flame/2008"
                minWidth="161" height="20" autoDrawBackground="false" fc:resizable="true">

    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;
            import mx.events.StateChangeEvent;

            import spark.components.List;

            protected function onDataChangeHandler(event:FlexEvent):void
            {
                this.title.text = this.data as String;
                this.adaptBg();
            }

             protected function adaptBg():void
            {
                this.bg.color = (itemIndex % 2 == 0) ? 0xEFEFEF : 0xE0E0E0;
            } 

        ]]>
    </fx:Script>


    <s:states>
        <s:State name="normal"/>
        <s:State name="hovered"/>
        <s:State name="selected"/>
    </s:states>
    <s:Rect x="0" y="0" width="161" height="20">
        <s:fill>
            <s:SolidColor id="bg" color="#EFEFEF"/>
        </s:fill>
    </s:Rect>
    <s:Rect x="0" y="0" width="161" height="20"
            visible.normal="false">
        <s:fill>
            <s:LinearGradient x="137" y="0" scaleX="31" rotation="90">
                <s:GradientEntry ratio="0" color="#FFEDD1"/>
                <s:GradientEntry ratio="0.5" color="#FFD180"/>
                <s:GradientEntry ratio="0.51" color="#EBAA1D"/>
                <s:GradientEntry ratio="1" color="#CF951A"/>
            </s:LinearGradient>
        </s:fill>
        <s:fill.hovered>
            <s:SolidColor alpha="0.24" color="#000000"/>
        </s:fill.hovered>
    </s:Rect>
    <s:Button x="5" y="2" width="20" height="16" buttonDown="trace('ok');" />
    <s:RichText id="title" d:id="103" d:userLabel="caldera0003" x="32" verticalCenter="1" ai:aa="2" color="#292929"
                columnCount="1" fontFamily="HelveticaNeueLT Pro 57 Cn" fontSize="14"
                kerning="on" tabStops="S36" flm:variant="34"
                whiteSpaceCollapse="preserve"/>
    <s:Rect width="274" height="31"
            visible="false" alpha.hovered="0.3"
            alpha.normal="0"
            alpha.selected="0.5">
        <s:fill>
            <s:SolidColor color="0xCED7EE"/>
        </s:fill>
    </s:Rect>
</s:ItemRenderer>
4

3 に答える 3

2

コメントで触れましたが、状況に違いがあるとのことでした。ドロップダウンリストアイテムに「削除」ボタンを追加することについてのこの質問に対する私の答えを最初に読んでください:このアイテムレンダラーで削除ボタンを使用してドロップダウンリストを作成します

必要なものを取得するためにそのコードから変更する必要があるのは1つだけです。つまり、アイテムが削除されたときにポップアップを開いたままにする必要があります。カスタムItemRendererに移動し、「削除」ボタンタグを見つけて、イベントが伝播しないようにします。イベントが伝播しない場合、DropDownListはイベントをキャッチせず、ユーザーがボタンをクリックしたときにポップアップが閉じることはありません。

<s:Button verticalCenter="0" right="10" width="16" height="16"
          mouseDown="event.stopImmediatePropagation(); remove()" />
于 2012-06-01T11:15:52.310 に答える
0

コンボボックスがフォーカスを失ったり閉じたりしても開いたままになるようにコンボボックスを拡張する必要がありますか? 削除ボタンを押すと、フォーカスが失われたイベントがコンボボックスに発生します。

于 2012-06-01T10:32:20.637 に答える