2013-10-15 3 views
-1

В основном, что говорится в названии. Я проверил DataGridSkin, и у него есть часть скина Скроллера, но я не могу найти какой-либо атрибут для количества прокрутки. Возможно, я пропустил это. Может ли кто-нибудь помочь мне в этом вопросе? Благодарю.Изменение количества прокрутки свечи DataGrid при использовании колеса мыши

+0

Почему этот вопрос неожиданно проголосовали? Это вопрос программирования, на который я уже нашел и опубликовал ответ. Что не так? – user940016

ответ

0

Я нашел решение: я использовал идею описано выше, но вместо того, чтобы создать класс, который расширяет 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 на нужную величину прокрутки.

+0

Просто некоторые мысли о шаге колеса мыши. «Шаг» для колеса мыши управляется в настройках мыши на компьютере. Для пользователей, которые уже настроили это значение, они получат другой опыт, чем то, что вы находите в своем тестировании. Таким образом, «правильное чувство» для прокрутки, которое вы настроили, может по-прежнему отличаться для других пользователей. – chrsmrtn

+0

Спасибо, у нас есть отдел QA, который отвечает за тестирование таких случаев. – user940016

3

Предлагаю следующее. Вы можете найти часть логики прокрутки в классе 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 переменного количество рендереров вы хотите прокручивать. Таким образом, в этом примере сетка прокручивается только одним элементом на колесе.

+0

Извините, ваше решение дало мне: Незаконное переопределение mouseWheelHandler – user940016

+0

Какую версию SDK вы используете? Пожалуйста, поделитесь своим кодом своего класса http://pastebin.com/ –

+0

Я немного изменил свое решение, и это решило мою проблему. См. Ответ, который я добавил. Спасибо, что дал мне правильное направление. – user940016