WP7 - 取消ContextMenu单击事件传播

时间:2011-01-14 23:47:41

标签: silverlight windows-phone-7 event-handling

当Silverlight工具包的ContextMenu已经注册了Tap事件UIElement的{​​{1}}时,我遇到了问题。单击上下文菜单会传播到基础元素并触发其tap事件。

例如,假设我有一个GestureListener,其中每个ListBox都注册了ListBoxItem和点击ContextMenu。假设单击上下文菜单item2应该将您带到Page1.xaml,而点击任何ListBox项本身应该会带您到Page2.xaml。

如果我打开ListBox中item1的上下文菜单,则上下文菜单item2位于ListBox item2之上。当我点击上下文菜单item2时,我会得到奇怪的行为,其中应用导航到Page1.xaml,然后立即导航到Page2.xaml,因为click事件也触发了GestureListener item2的Tap手势。

我在调试器中验证过,它始终是首先接收click事件的上下文菜单。如何取消上下文菜单项单击的路由事件传播,使其无法到达ListBox item2?

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

您可以通过执行以下操作来解决问题:

  • 在上下文菜单中Opened处理程序集LayoutRoot.IsHitTestVisibleLayoutRoot是根UIElement的默认名称)到false

  • 在上下文菜单的Closed处理程序中将LayoutRoot.IsHitTestVisible设置回true

答案 1 :(得分:1)

在显示上下文菜单时,您可以尝试在受影响的区域/页面上添加一个带有透明背景(重要)的矩形。

答案 2 :(得分:1)

我有一个非常类似的问题,但我使用ManipulationCompleted事件作为“点击”检测器,因为ContentMenu应用的对象是自定义控件。

LayoutRoot.IsHitTestVisible对我不起作用,可能是因为它不适用于操纵事件。然而,它让我走上了正确的道路。我只是实现了我自己的简单等价 - 我在页面的范围内创建了一个布尔变量bCancelManipulation

  • 在ContentMenu的Opened事件中,将其设置为True。
  • 在ContentMenu的Closed事件中,将其设置为False。
  • ManipulationCompleted函数中,我要做的第一件事是检查 if(bCancelManipulation==true) { return; }

这是一种黑客行为,但它的效果非常好并且编码非常简单 - 它也很容易适应Tap事件。