0

这是布局:

<s:Scroller>
    <s:VGroup>
        <s:List id="list1"/>
        <s:List id="list2"/>
        <component:ThirdPartyComponent/>
    </s:VGroup>
</s:Scroller>

所以,我的应用程序应该只向右显示 1 个滚动条,即 scoller、list1、list2 等不应该显示滚动条。

它工作了一会儿,直到我们发现鼠标滚轮滚动不起作用。似乎是mouseWheel子组件(列表和第三方)捕获的事件。

通过网络搜索找到解决方案,有stopImmediatePropagation()mouseWheel事件的解决方案,但似乎不是一个好的解决方案。mouseWheel除了 ThirdPartyCompoent 的部分,做滚动是一个私人成员,所以没有办法从 ThirdPartyCompoent听

任何想法?

结案

到目前为止,通过监听mouseWheel事件并在那里禁用 root解决了这个问题VGroup mouseChildren,然后在 root VGroupclick 处理程序上我启用了mouseChildren. 但如果有更多 elegan 解决方案,请发表评论。

4

2 回答 2

1

也许这些选项可以帮助你

选项1

<component:ThirdPartyComponent 
           creationComplete = "afterCreation()" 
           id               = "TPComponent">
  <fx:Script>

     // You could use initialize or creationComplete to handle MouseWheel Listener
     private function afterCreation():void{
       this.addEventListener(MouseEvent.MOUSE_WHEEL, hoverHandler);
     }
     private function hoverHandler(e:MouseEvent):void{
       if(!e.isDefaultPrevented()){
         e.preventDefault();
         e.cancelBubble = true;
         e.cancel = true;
         e.returnValue = false;
       }
       return false;
     }
  </fx:Script>
</component:ThirdPartyComponent>

但我建议您使用 MouseEvent.ROLL_OVER 在子组件中禁用 MouseWheel,因为它覆盖了显示对象容器的任何子对象的所有区域。buble 事件应该返回 false,这样孩子就没有机会调度任何鼠标事件,包括 MOUSE_WHEEL。

选项#:2

<component:ThirdPartyComponent 
           creationComplete = "afterCreation()" 
           id               = "TPComponent">
  <fx:Script>

     private function afterCreation():void{
       this.mouseChildren = false;
     }

  </fx:Script>
</component:ThirdPartyComponent>

通过将 mouseChildren 设置为 false,任何 mouseChildren 上的事件都会神奇地传递给父级。mouseChildren 不等于 mouseEnabled,因此任何给定的返回都会产生不同的影响:)

您可以组合选项# 1 和选项# 2 或选择其中一个,这是最适合您的 :)

于 2012-06-24T04:55:24.607 回答
0

您可以通过递归访问第三方组件子组件

如何递归访问children的children?

并将鼠标滚轮块处理程序添加到您需要的孩子

于 2012-06-22T08:48:36.883 回答