В основном, что говорится в названии. Я проверил DataGridSkin, и у него есть часть скина Скроллера, но я не могу найти какой-либо атрибут для количества прокрутки. Возможно, я пропустил это. Может ли кто-нибудь помочь мне в этом вопросе? Благодарю.Изменение количества прокрутки свечи DataGrid при использовании колеса мыши
ответ
Я нашел решение: я использовал идею описано выше, но вместо того, чтобы создать класс, который расширяет VScrollBar, я добавил слушатель события MouseWheelChanging к полосе прокрутки в коже скроллер:
<fx:Component id="verticalScrollBarFactory">
<s:VScrollBar visible="false" mouseWheelChanging="outerDocument.vScrollBarWheelChanging(event)"/>
</fx:Component>
internal function vScrollBarWheelChanging(event:MouseEvent):void
{ event.delta/=Math.abs(event.delta); }
Вы можете установите event.delta
на нужную величину прокрутки.
Просто некоторые мысли о шаге колеса мыши. «Шаг» для колеса мыши управляется в настройках мыши на компьютере. Для пользователей, которые уже настроили это значение, они получат другой опыт, чем то, что вы находите в своем тестировании. Таким образом, «правильное чувство» для прокрутки, которое вы настроили, может по-прежнему отличаться для других пользователей. – chrsmrtn
Спасибо, у нас есть отдел QA, который отвечает за тестирование таких случаев. – user940016
Предлагаю следующее. Вы можете найти часть логики прокрутки в классе VScrollBar
в методе mouseWheelHandler
.
var nSteps:uint = Math.abs(delta);
...
for (var vStep:int = 0; vStep < nSteps; vStep++)
{
var vspDelta:Number = vp.getVerticalScrollPositionDelta(navigationUnit);
...
В моем случае delta
равен 3
. И сетка прокручивается на 3 высоты рендеринга. Вы можете расширить класс VScrollBar. Затем создайте собственный ScrollerSkin (копия с оригинала) и установите вертикальную панель там, а не по умолчанию. Затем создайте собственный скин DataGrid
(снова скопируйте с оригинала) и установите свой собственный скин скроллер для Scroller
.
В пользовательском классе VScrollBar переопределить метод mouseWheelHandler
. Пример:
package {
import flash.events.Event;
import flash.events.MouseEvent;
import mx.core.IInvalidating;
import mx.core.mx_internal;
import mx.events.FlexMouseEvent;
import spark.components.VScrollBar;
import spark.core.IViewport;
import spark.core.NavigationUnit;
import spark.utils.MouseEventUtil;
use namespace mx_internal;
public class MyVScrollBar extends VScrollBar {
public function MyVScrollBar() {
}
override mx_internal function mouseWheelHandler(event:MouseEvent):void {
const vp:IViewport = viewport;
if (event.isDefaultPrevented() || !vp || !vp.visible || !visible)
return;
var changingEvent:FlexMouseEvent = MouseEventUtil.createMouseWheelChangingEvent(event);
if (!dispatchEvent(changingEvent))
{
event.preventDefault();
return;
}
const delta:int = changingEvent.delta;
var nSteps:uint = 1; //number of renderers scrolled!
var navigationUnit:uint;
var scrollPositionChanged:Boolean;
navigationUnit = (delta < 0) ? NavigationUnit.DOWN : NavigationUnit.UP;
for (var vStep:int = 0; vStep < nSteps; vStep++)
{
var vspDelta:Number = vp.getVerticalScrollPositionDelta(navigationUnit);
if (!isNaN(vspDelta))
{
vp.verticalScrollPosition += vspDelta;
scrollPositionChanged = true;
if (vp is IInvalidating)
IInvalidating(vp).validateNow();
}
}
if (scrollPositionChanged)
dispatchEvent(new Event(Event.CHANGE));
event.preventDefault();
}
}
}
Set nSteps
переменного количество рендереров вы хотите прокручивать. Таким образом, в этом примере сетка прокручивается только одним элементом на колесе.
Извините, ваше решение дало мне: Незаконное переопределение mouseWheelHandler – user940016
Какую версию SDK вы используете? Пожалуйста, поделитесь своим кодом своего класса http://pastebin.com/ –
Я немного изменил свое решение, и это решило мою проблему. См. Ответ, который я добавил. Спасибо, что дал мне правильное направление. – user940016
Почему этот вопрос неожиданно проголосовали? Это вопрос программирования, на который я уже нашел и опубликовал ответ. Что не так? – user940016