2013-10-15 97 views
-1

基本上標題說的是什麼。我檢查了DataGridSkin,它有一個Scroller外觀部分,但我找不到滾動數量的任何屬性。我可能錯過了它。 任何人都可以在這個問題上幫助我嗎?謝謝。使用鼠標滾輪時更改火花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

我建議如下。您可以在mouseWheelHandler方法中的VScrollBar類中找到部分滾動邏輯。

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

nSteps設置爲您要滾動的渲染器數量。所以在這個例子中,網格僅由滾輪上的一個項目滾動。

+0

對不起,您的解決方案給了我:非法覆蓋mouseWheelHandler – user940016

+0

您使用的是哪個版本的SDK?請分享你的班級代碼http://pastebin.com/ –

+0

我改變了你的解決方案,這解決了我的問題。看到我添加的答案。謝謝你給我正確的方向。 – user940016