Hi All I've been having problems with the amount of scrolling that happens when you use the mouse-wheel with VScrollBar. I came up with two possible solutions(well actually my co-worked came up with the one and I came up with the other), one is to prevent the default behaviour of the mouseWheelChanging event. The other was to extend the vScrollbar class and overwrite some functionality inside it. Both implementations are below. The problem is that while both of these solutions work inside of firefox and chrome, they don't seem to work in IE9, I'm guessing that IE9 is somehow sending mouse-wheel events differently to the way it's done with the flashplayer in the other browsers.
Has anyone encountered this before and know of a workaround? Thanks Wouter like so: ---------------------------------------MXML------------------------------------------------- <s:VScrollBar id="vScrollBar" viewport="{grpContent}" mouseWheelChanging="MouseWheelInhibitor.mouseWheelChangingHandler(event)" /> --------------------------------------- AS ------------------------------------------------- package za.co.briteblue.twentytwoseven.presentation.components { import mx.events.FlexMouseEvent; import spark.components.VScrollBar; public class MouseWheelInhibitor { public static function mouseWheelChangingHandler(event:FlexMouseEvent):void { // don't scroll by preventing default event.preventDefault(); // est amount to scroll based on height of viewport. var delta:Number = VScrollBar(event.target).viewport.height / 20; if(event.delta < 0) VScrollBar(event.target).viewport.verticalScrollPosition += delta; else VScrollBar(event.target).viewport.verticalScrollPosition -= delta; } } } ----------------------------------- other solution extending the vscrollbar class ----------------------------------------- package za.co.briteblue.twentytwoseven.presentation.components { 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 TTSVScrollBar extends VScrollBar { public function TTSVScrollBar() { super(); } // @author: braam // overridden to prevent viewport forced validation with every vertical scroll position update. // when viewport is a datagrid, performance is terrible for mouse wheel scrolling. override mx_internal function mouseWheelHandler(event:MouseEvent):void { const vp:IViewport = viewport; if (event.isDefaultPrevented() || !vp || !vp.visible || !visible) return; // Dispatch the "mouseWheelChanging" event. If preventDefault() is called // on this event, the event will be cancelled. Otherwise if the delta // is modified the new value will be used. var changingEvent:FlexMouseEvent = MouseEventUtil.createMouseWheelChangingEvent(event); if (!dispatchEvent(changingEvent)) { event.preventDefault(); return; } const delta:int = changingEvent.delta; var nSteps:uint = Math.abs(delta); var navigationUnit:uint; var scrollPositionChanged:Boolean; // Scroll delta "steps". 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(); } } }