0

基本上就是标题所说的。我检查了 DataGridSkin,它有一个 Scroller 皮肤部分,但我找不到滚动量的任何属性。我可能错过了。有人可以帮我解决这个问题吗?谢谢。

4

2 回答 2

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

nSteps变量设置为要滚动的渲染器数量。因此,在此示例中,网格仅滚动滚轮上的一项。

于 2013-10-15T16:05:56.970 回答
0

我找到了一个解决方案:我使用了上面描述的想法,但是我没有创建一个扩展 VScrollBar 的类,而是在 Scroller 皮肤的滚动条中添加了一个 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为所需的滚动量。

于 2013-10-16T11:09:47.513 回答