使用鼠标滚轮滚动包含spark列表的应用程序

时间:2011-03-18 18:07:50

标签: flex flex4

我有一个显示spark.List的应用程序。 我的列表中的每个项目都必须可见(没有垂直滚动)。

我需要我的应用程序可以在Web浏览器中滚动,所以我添加了一个包含所有组件的Scroller。当浏览器窗口太小而无法包含我的所有应用程序时,会出现scrollBar。

我的应用程序看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" width="100%"  height="100%" >

     <fx:Declarations>
     </fx:Declarations>

    <s:Scroller id="myScroller" width="100%" height="100%">
      <s:VGroup >
        <s:Label text="toto1"/>
        <s:List>
            <s:dataProvider>
                <s:ArrayCollection>
                    <fx:String>item1</fx:String>
                    <fx:String>item2</fx:String>
                    <fx:String>item3</fx:String>
                    <fx:String>item4</fx:String>
                    <fx:String>item5</fx:String>
                </s:ArrayCollection>
            </s:dataProvider>
        </s:List>
        <s:Label text="toto2"/>
    </s:VGroup>
</s:Scroller>
</s:Application>

我的问题在于鼠标滚轮事件。

  • 当我将鼠标光标滚动到List之外时,一切正常。

  • 当我用鼠标光标滚动到列表上时,没有任何反应。

如果列表没有滚动条,它看起来像是鼠标轮事件被停止了。

有谁知道如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

我注意到滚动条会捕获鼠标滚轮事件,即使它不可见/活动也是如此。

  1. 最好的选择是让Adobe在SDK中解决此问题
  2. 下一个最佳选择是修改滚动条类以不捕获鼠标滚轮事件
  3. 列表的快速和脏修复,其中“我的列表中的每个项目都必须可见(无垂直滚动)”。是做一个快速重新皮肤。默认的ListSkin.mxml类在此处粘贴有点大,所以这是您需要更改的位(注意:我已删除了注释):
  4. <s:Scroller left="0" top="0" right="0" bottom="0" id="scroller" minViewportInset="1" hasFocusableChildren="false">
            <s:DataGroup id="dataGroup" itemRenderer="spark.skins.spark.DefaultItemRenderer">
                 <s:layout>
                    <s:VerticalLayout gap="0" horizontalAlign="contentJustify" requestedMinRowCount="5" />
                </s:layout>
            </s:DataGroup>
        </s:Scroller>
    

    只需将整个类复制并粘贴到新皮肤中,然后摆脱(删除)Scoller。如果您现在将此外观应用于其定义或CSS中的列表,那么您应该很高兴。

    *您还需要删除我在第42,45,89,95行上可以看到的滚动条的4个引用。 List类不需要滚动器SkinPart。

答案 1 :(得分:0)

我仔细查看了SDK代码,我认为这是一个错误。在某个地方,有一段代码没有检查滚动条是否显示并对事件执行'preventDefault()',阻止它冒泡到父scoller。

您应该在bugs.adobe.com/flex上提交错误。

答案 2 :(得分:0)

我在这里找到了一个可接受的解决方法:flexache

英文很糟糕,但我刚刚在我的滚动条mainScroller及其内部的vgroup mainVGroup中添加了一个ID,并在滚动条的鼠标滚轮上添加了一个事件处理程序:

            mainScroller.addEventListener(MouseEvent.MOUSE_WHEEL,
               function scroller1_mouseWheelHandler(event:MouseEvent):void{
                   //calculate the new position 
                   mainVGroup.verticalScrollPosition+=(event.delta*-20);            
                   //stop the event’s bubbling
                   event.stopPropagation();
               }
           ,true);

它并不完美(仍然有点口吃),但它符合我的目的。