2012-06-27 26 views
0

我只想處理焦點處理程序,只處理我想要聽的組件但不處理該組件內部的子項。 例如,我在vgroup容器內有一個vgroup我有UI控件,如TextInput,TextArea,ComboBox,我想爲VGroup監聽焦點,所以我保留focusGhandler for VGroup,但是當我將焦點從textinput改變爲textarea或combobox focusoutHandler時,如何給focusOut只爲VGroup。Flex:如何僅將焦點處理程序處理到組件,但不處理組件中的子項

<s:VGroup id="vGroup" focusOut = vGroupFocusOutHandler(event)> 
    <s:TextInput /> 
    <s:TextArea/> 
    <s:ComboBox/> 
<s:VGroup/> 

回答

1

你必須確保用戶聚焦到的對象不是在Vgroup的孩子(直接或間接)。如果它是一個孩子,我們什麼都不做;如果不是的話,我們會做必須做的事情。

方法如下:

<s:VGroup id="vGroup" focusOut="handleFocusOut(event)"> 
    <s:TextInput /> 
    <s:TextArea /> 
    <s:ComboBox /> 
</s:VGroup> 

private function handleFocusOut(event:FocusEvent):void { 
    //only do something if we focus out of vGroup 
    if (!isInVGroup(event.relatedObject)) { 
     trace(event); 
    } 
} 

private function isInVGroup(el:InteractiveObject):Boolean { 
    if (!el || !el.parent) return false; 

    var parent:DisplayObjectContainer = el.parent; 
    while (parent != vGroup && parent != stage) { 
     parent = parent.parent; 
    } 

    return parent == vGroup; 
} 

relatedObject屬性是用戶關注的元素。

+0

感謝烏拉圭回合的答案RIAstar這裏的問題是我有這麼多的控​​制,以及其他容器,其Vgroup內部有動態添加其很難爲每個控制添加焦點,所以有沒有解決方案。 – Trinu

+0

@Trinu好評!我已經更新了我的答案並使其更加優雅(感謝您的評論)。 – RIAstar

+0

感謝RIAstar的工作 – Trinu

1

可以在事件處理程序代碼試試這個:

private function handleFocusOut(event:FocusEvent):void { 
    //only do something if we focus out of vGroup 
    if (!this.contains(event.relatedObject)) { 
     trace(event); 
    } 
} 
相關問題