PDA

Просмотр полной версии : Прокрутка контента при положении курсора мыши над TextArea


vasyapunk
26.07.2010, 00:42
Привет всем)
Почему когда курсор мыши находится над TextArea, то нельзя скролить контент колесиком?
Кто знает как это избегать - помогите пожалуйста)

VARion
26.07.2010, 12:59
Есть аналогичная проблема: внутри Scroller находятся NumericStepper и когда в них помещён курсор, то скроллер не прокручивается колесом мыши. Спрашивал решение здесь, но никто не ответил.
Судя по-всему проблема в одном и том же, подскажите пожалуйста что с этим делать?

alatar
26.07.2010, 13:54
Проблема в том, что текстовые поля перехватывают событие прокрутки для своих нужд. Выход либо передавать событие выше по иерархии, либо отрубать мышь для этих полей.

VARion
26.07.2010, 15:06
Сделал сейчас такой тест с NumericStepper и TextArea:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
minWidth="955" minHeight="600">
<fx:Script>
<![CDATA[
protected function nStep_mouseWheelHandler(event:MouseEvent):void {
event.preventDefault();
}
protected function tArea_mouseWheelHandler(event:MouseEvent):void {
event.preventDefault();
}
]]>
</fx:Script>
<s:Scroller x="126" y="135" width="200" height="150">
<s:VGroup width="100%">
<s:Button label="Кнопка"/>
<s:Label text="Метка"/>
<s:NumericStepper id="nStep" mouseEnabled="false"
mouseWheel="nStep_mouseWheelHandler(event)"/>
<s:CheckBox label="Флажок"/>
<s:TextArea id="tArea" width="100%" height="100" mouseEnabled="false"
mouseWheel="tArea_mouseWheelHandler(event)"/>
</s:VGroup>
</s:Scroller>
</s:Application>

Это не помогает никак. Даже если мышь не находится над данным NumericStepper, но имеет фокус - всё равно значение меняется в нём и Scroller не прокручивается.
Что я делаю не так? Можно какой-то пример, чтобы разобраться?

vasyapunk
26.07.2010, 17:05
я сделал так..
Создал класс:
package freetools
{
import flash.events.MouseEvent;

import mx.controls.TextArea;

public class UnscrollableTextArea extends TextArea
{
override protected function mouseWheelHandler(event:MouseEvent):void
{

}
}
}


и вместо myTextArea:TextArea пишу myTextArea:UnscrollableTextArea .Работает ))

VARion
26.07.2010, 21:10
Аналогичная реализация для NumericStepper:

package comps
{
import spark.components.NumericStepper;
import flash.events.MouseEvent;

public class UnscrollNumStepper extends NumericStepper
{
public function UnscrollNumStepper() {
super();
}
override protected function system_mouseWheelHandler(event:MouseEvent):void {
}
}
}

Такой способ работает, спасибо за наводку.
Может можно как-нибудь обойтись без дополнительных классов?
Отмена стандартной обработки event.preventDefault() не срабатывает у меня т.к. обработчик мой вызывается только когда мышь над NumericStepper, а значения меняются даже без этого, лишь бы курсор внутри был. Это происходит из-за того, что system_mouseWheelHandler (класс Spinner), который я перекрываю подписан на корневой SystemManager, а не на сам компонент, видимо поэтому события идут мимо.

alatar
27.07.2010, 00:16
Можно попробовать подписаться на скрол у компонента, и в обработчике вписать event.stopPropagation