2010-08-24 7 views
2

J'ai une question (j'espère) rapide. J'ai des boites de stepper. Bien que cela puisse vraiment s'appliquer à n'importe quel composant interactif. Je veux que la case sélectionnée perde le focus quand je clique n'importe où ailleurs (scène incluse). Y a-t-il un moyen facile de faire ceci? Je n'arrive pas à trouver un moyen efficace de le faire perdre de vue.Flex: Lose Focus sur les composants

+0

Il ne perd pas automatiquement le focus lorsque vous cliquez ailleurs? – JeffryHouser

+0

Pas aussi loin que je peux gérer. Si je clique sur n'importe où ailleurs, une fois que j'ai un composant sélectionné, je peux seulement sélectionner un autre composant. Je ne peux pas désélectionner tous les composants en cliquant sur la scène. – grey

Répondre

3

Dans le cas où quelqu'un d'autre trouve leur chemin ici à la recherche d'une solution à ce problème, voici la réponse:

private function onGlobalMouseUp(event : MouseEvent) : void { 
     var fm:FocusManager = new FocusManager(stage); 

     //Since Flash Player can set focus on subcomponents as well as on components themselves, 
     //findFocusManagerComponent is used to find the component that either has focus or contains the subcomponent 
     //that has focus. If, for example, a TextField contained within a TextArea component has focus, findFocusManagerComponent 
     //will return the TextArea component, and not the TextField. This being the case, we can definitely determine 
     //whether the target object of the MouseUp event is a component (or is part of a component). If the target 
     //object is NOT a component (nor contained within one), then we clear all component focus. 

     if(fm.findFocusManagerComponent(event.target as InteractiveObject) is UIComponent){ 
      //target of MouseUp is either a UIComponent, or is contained within a UIComponent, so do nothing. 
     }else{ 
      //target of MouseUp is neither a UIComponent, nor is it contained within a UIComponent, so set component focus to null. 
      fm.setFocus(null); 
     } 
    } 
0

Vous devriez peut-être vérifier FocusManager.hideFocus(). Peut-être lier dans l'événement focusOut de votre UIComponent.

Flex API

+0

Peut-être que je ne comprends pas, mais je ne suis pas seulement intéressé à cacher l'indicateur. Si je le cache et qu'il est toujours sélectionné, alors d'autres interactions comme frapper les flèches haut et bas feront incrémenter ou décrémenter un stepper. Je veux désélectionner les composants sélectionnés. – grey

2

Alors, voici la solution que je suis venu avec ça fonctionne très bien. J'ai une fonction appelée add() qui a été assignée à applicationComplete. Dans cette fonction, j'inclure:

this.skin.addEventListener(MouseEvent.MOUSE_UP, loseFocus); 

Quels sont les appels:

private function loseFocus(e : MouseEvent) : void 
{ 
    if (e.eventPhase == EventPhase.AT_TARGET) 
    { 
     this.focusManager.deactivate(); 
    } 
} 

assez simple, et fait ce que je cherchais. Le filtre "Phase" est nécessaire pour empêcher les autres composants d'enregistrer les clics.

Remarque importante: this.skin doit être la cible de l'événement. La scène n'est jamais exposée à la souris dans une application Flex.

Example Application Code

Si quelqu'un a une meilleure solution, s'il vous plaît suggérer un!

+0

Vous l'avez cloué :) Merci! – mik

Questions connexes