禁用子组件上的鼠标滚轮滚动

时间:2012-06-21 04:26:36

标签: flex air

这是布局:

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

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

它工作正常,直到我们发现鼠标滚轮不能正常工作。似乎是子组件(list和thirdparty)捕获的mouseWheel事件。

通过网络搜索找到解决方案,有stopImmediatePropagation()子事件mouseWheel的解决方案,但似乎不是一个好的解决方案。在ThirdPartyCompoent的部分旁边,滚动是一个私有成员,所以无法从ThirdPartyCompoent中听mouseWheel

任何想法?

CASE CLOSE

到目前为止,通过监听mouseWheel事件并在那里禁用根VGroup mouseChildren来解决案例,然后在根VGroup点击处理程序上启用mouseChildren但如果有更多的elegan解决方案,请发表评论。

2 个答案:

答案 0 :(得分: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&amp;选项#2或选择其中一个,这是最适合你的:)

答案 1 :(得分:0)

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

How to access children of children recursively?

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