2012-06-01 3 views
1

Я использую combobox с настраиваемым средством визуализации элементов, каждый элемент содержит кнопку «удалить», чтобы удалить соответствующий элемент из списка. Проблема в том, что когда я нажимаю на эту кнопку, всплывающее окно combobox автоматически закрывается, как я могу заставить его оставаться открытым, когда я нажимаю кнопку?ComboBox auto close

Это как декларируется мой 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> 
+0

Возможно, вам придется расширить ComboBox и предотвратить поведение по умолчанию закрытия раскрывающегося списка при щелчке мышью. Spark ComboBox расширяет DropDownListBase, который имеет защищенный метод с именем 'item_mouseDownHandler()', который вы могли бы переопределить для этого. –

+0

Я уже ответил на этот вопрос. Позволь мне это посмотреть. – RIAstar

+0

Вот он: http://stackoverflow.com/questions/8925474/create-dropdownlist-with-delete-button-in-this-itemrenderer/8928105#8928105. Этот вопрос касался DropDownList, но техника должна работать и для ComboBox. – RIAstar

ответ

2

Я упомянул об этом в комментариях, но вы указали, что есть разница с вашей ситуацией. Сначала прочитайте мой ответ на этот вопрос о добавлении кнопки «Удалить» в элементы DropDownList: Create dropdownlist with delete button in this itemrenderer

Есть только одна вещь, которую вам нужно изменить для этого кода, чтобы получить то, что вы хотите, т.е. всплывающее окно должно оставаться открытым, когда элемент удален. Перейдите в пользовательский ItemRenderer, найдите тег Button 'delete' и просто запретите распространение события. Если событие не распространяется, DropDownList никогда не поймает его, и всплывающее окно никогда не будет закрыто, когда пользователь нажмет на кнопку.

<s:Button verticalCenter="0" right="10" width="16" height="16" 
      mouseDown="event.stopImmediatePropagation(); remove()" /> 
+0

Отлично! 'event.stopImmediatePropagation()' это то, чего я отсутствовал, большое спасибо! – jroy

0

Может быть, я что-то неправильно понять, но не можете ли вы просто добавить обработчик mouseDown на кнопку удаления и остановить распространение события в нем? Как

<s:Button x="5" y="2" 
      width="20" height="16" 
      mouseDown="button1_mouseDownHandler(event)" buttonDown="trace('ok');" 
      /> 

и

protected function button1_mouseDownHandler(event:MouseEvent):void 
{ 
    event.stopPropagation(); 
    ... 
} 
0

Может быть, вы должны продлить выпадающий оставаться открытым, когда оно теряет фокус или закрывается? Нажатие кнопки удаления приводит к событию с потерей фокуса в выпадающем списке.