我需要打开一个菜单,因为WP7是not designed
来执行此类操作,我正在使用Toolkit。以下是示例代码:
<Border BorderThickness="3" Padding="6">
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu>
<toolkit:MenuItem Header="item1" Click="Item1_Click" />
<toolkit:MenuItem Header="item2" Click="Item2_Click" />
<toolkit:MenuItem Header="item3" Click="Item3_Click" />
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
<TextBlock Text="Tap" />
</Border>
现在,只要用户执行按住操作,此功能就可以正常工作。但我不能要求用户采取这样的行动。我需要在单击/点击/触摸/手势(您要调用它的水)上显示菜单。有人可以建议吗?如果您认为工具包不是最佳方式,那么请使用示例代码建议替代方案。我试过弹出窗口,但这比我的应用程序更糟糕
答案 0 :(得分:14)
您可以将GestureListener
添加到Border
并订阅Tap
事件。在事件处理程序中,如果ContextMenu
没有逻辑父代,则会获得Border
的{{1}}并将IsOpen
设置为true。
<Border BorderThickness="3" Padding="6">
<toolkit:GestureService.GestureListener>
<toolkit:GestureListener Tap="GestureListener_Tap" />
</toolkit:GestureService.GestureListener>
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu>
<toolkit:MenuItem Header="item1" Click="Item1_Click" />
<toolkit:MenuItem Header="item2" Click="Item2_Click" />
<toolkit:MenuItem Header="item3" Click="Item3_Click" />
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
<TextBlock Text="Tap" />
</Border>
private void GestureListener_Tap(object sender, GestureEventArgs e)
{
Border border = sender as Border;
ContextMenu contextMenu = ContextMenuService.GetContextMenu(border);
if (contextMenu.Parent == null)
{
contextMenu.IsOpen = true;
}
}
答案 1 :(得分:0)
如果您需要应用程序的上下文菜单,则ContextMenu
和ContextMenuService
是最佳方法,因为它是整个第三方和预安装应用程序的标准。用户已经理解了“点击并保持”手势,因此解决这个问题将违反直觉。
如果(无论出于何种原因)您必须通过单击启动ContextMenu
,那么您始终可以从Silverlight Toolkit自定义ContextMenu.cs的源代码,以便不要挂钩{{1事件它挂钩了Hold
事件。