2009-10-26 4 views
2

J'ajoute juste un Flex HSlider à ma boîte de dialogue. Il permet de définir une durée en jours, et je pensais que ce serait génial si l'utilisateur pouvait s'accrocher à des semaines en appuyant sur la touche SHIFT tout en faisant glisser le curseur.MouseEvent shiftKey ou ctrlKey est toujours faux

Malheureusement l'événement passé au gestionnaire d'événements ne contient pas d'informations de modification clé ..

Voici mon code:

protected function onDurationSliderChange (event:SliderEvent) : void 
{ 
    var durationInDays : int = this.sld_durationInDays.value; 

    // modifiers 
    if (event.triggerEvent is MouseEvent) { 
     var mouseEvt : MouseEvent = event.triggerEvent as MouseEvent; 
     trace (mouseEvt.ctrlKey + " " + mouseEvt.ctrlKey + " " + event.keyCode); 
     trace (mouseEvt); 

     // when using SHIFT, snap to week 
     if (mouseEvt.shiftKey && !mouseEvt.ctrlKey) 
      durationInDays = int(durationInDays/7) * 7; 
    } 
    this.durationInDays = durationInDays; 
} 

qui produit la sortie suivante:

false false -1 
[MouseEvent type="click" bubbles=true cancelable=false eventPhase=2 localX=NaN localY=NaN stageX=NaN stageY=NaN relatedObject=null ctrlKey=false altKey=false shiftKey=false buttonDown=false delta=0] 

Tout le monde eu une idée comment savoir si SHIFT (ou CTRL) a été pressé en faisant glisser? Merci!

Répondre

2

Ma proposition:

Ajouter cette variable dans votre application:

private var shiftPressed:Boolena = false; 

Ajoutez cette ligne dans le gestionnaire creationComplete dans votre application

this.stage.addEventListener(KeyboardEvent.KEY_DOWN, checkKeyHandler); 
this.stage.addEventListener(KeyboardEvent.KEY_UP, unCheckKeyHandler); 

Ensuite, ajoutez cette fonction

private function checkKeyHandler(event:KeyboardEvent):void { 
    if (event.shiftKey) 
     shiftPressed = true; 
} 

private function unCheckKeyHandler(event:KeyboardEvent):void { 
    shiftPressed = false; 
} 

Et modifiez votre fonction

protected function onDurationSliderChange (event:SliderEvent) : void 
{ 
    if(shiftPressed) { 
     //add your operations 
    } else { 
     //add your operations 
    } 
} 
+0

Oui, merci, ça marche ! Deux choses: 1) Je ne pouvais pas ajouter les écouteurs d'événement à 'this.stage' car il est nul, mais l'ajout de 'this' fonctionne 2) Juste après le démarrage de l'application, je devais cliquer sur un composant pour donner le focus au Flex App, sinon je n'aurais aucun événement clavier. Le simple fait de cliquer n'importe où dans l'application Flex n'a pas fait l'affaire. – Tom

+0

J'ai eu un problème similaire avec une liste et le itemClickEvent, qui ne contient pas non plus d'informations de modificateur de clé. La solution d'Arkadiusz Kondas a aidé. –

0

j'ai trouvé cette solution:

définir la variable shiftPressed comme dit précédemment:

private var shiftPressed:Boolean = false; 

puis utilisez les auditeurs prédéfinis sur le composant s:slider:

mouseDown="{shiftPressed = event.shiftKey}" 
mouseUp="{shiftPressed = false}" 

alors vous pouvez utiliser le snapInterval propriété du s:slider ou mettre en œuvre la logique dans le gestionnaire change, dans mon cas je besoin juste à l'étape de 45 si le changement a été pressé et de 0,01 autrement, donc j'utilisé:

snapInterval="{(shiftPressed)?45:0.01}"