MouseEvent shiftKey или ctrlKey всегда ложны - PullRequest
2 голосов
/ 26 октября 2009

Я просто добавляю Flex HSlider в свой диалог. Он позволяет устанавливать продолжительность времени в днях, и я подумал, что было бы здорово, если бы пользователь мог привязываться к неделям, нажимая клавишу SHIFT при перетаскивании ползунка.

К сожалению, событие, переданное обработчику событий, не содержит информации о модификаторе ключа.

Вот мой код:

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;
}

, который производит следующий вывод:

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]

Кто-нибудь получил идею, как узнать, была ли нажата клавиша SHIFT (или CTRL) при перетаскивании? Спасибо!

Ответы [ 2 ]

2 голосов
/ 26 октября 2009

Мое предложение:

Добавьте эту переменную в ваше приложение:

private var shiftPressed:Boolena = false;

Добавьте эту строку в обработчик creationComplete в вашем приложении

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

Далее добавьте эти функции

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

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

И измените свою функцию

protected function onDurationSliderChange (event:SliderEvent) : void
{
    if(shiftPressed) {
        //add your operations
    } else {
        //add your operations
    }
}
0 голосов
/ 06 июня 2014

Я нашел это решение:

установить переменную shiftPressed как сказано ранее:

private var shiftPressed:Boolean = false;

затем используйте предопределенные прослушиватели для компонента s:slider:

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

тогда вы можете использовать свойство snapInterval s:slider или реализовать логику в обработчике change, в моем случае мне нужно было просто перейти на 45, если нажата клавиша Shift, и на 0,01, в противном случае используется:

snapInterval="{(shiftPressed)?45:0.01}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...