当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?
感谢您的帮助!
答案 0 :(得分:2)
您可以通过执行以下操作来解决问题:
在上下文菜单中Opened
处理程序集LayoutRoot.IsHitTestVisible
(LayoutRoot
是根UIElement
的默认名称)到false
在上下文菜单的Closed
处理程序中将LayoutRoot.IsHitTestVisible
设置回true
答案 1 :(得分:1)
在显示上下文菜单时,您可以尝试在受影响的区域/页面上添加一个带有透明背景(重要)的矩形。
答案 2 :(得分:1)
我有一个非常类似的问题,但我使用ManipulationCompleted
事件作为“点击”检测器,因为ContentMenu应用的对象是自定义控件。
LayoutRoot.IsHitTestVisible
对我不起作用,可能是因为它不适用于操纵事件。然而,它让我走上了正确的道路。我只是实现了我自己的简单等价 - 我在页面的范围内创建了一个布尔变量bCancelManipulation
。
Opened
事件中,将其设置为True。 Closed
事件中,将其设置为False。ManipulationCompleted
函数中,我要做的第一件事是检查
if(bCancelManipulation==true) { return; }
这是一种黑客行为,但它的效果非常好并且编码非常简单 - 它也很容易适应Tap事件。