方法一:请阅读大气象学习园地的方法。
文章简明扼要,很受益。
我试图在“ContextMenuService.SetContextMenu(btnRight, cm);//为控件绑定右键菜单”
这一句中使用一个现成的菜单代替cm ,报错:元素已经是另一个元素的子元素。
所以,如果你象我一样,不喜欢使用代码创建菜单,请使用另一种方法:
方法二:
第1步、设计:直接在设计界面中创建ContextMenu,添加N项MenuItem,MenuItem还可以添加子菜单,如果你不知道怎么使用VS2010设计菜单,请查阅其它资料。需要注意两点,一是最好将菜单放在顶层容器中,以便在各个控件边上自由走动;二是要事先设置Visibility属性为Collapsed,即先不显示。
第2步、定位:例如需要显示在控件A下方左对齐。需要在控件A的MouseEnter事件中添加以下代码:
Dim p1 = e.GetPosition(Me.LayoutRoot) Dim p2 = e.GetPosition(sender) Dim p = New Point(p1.X - p2.X, p1.Y - p2.Y + Me.btnTestMenu.Height) Me.menuMain.SetValue(ContextMenu.MarginProperty, New Thickness(p.X, p.Y, 0, 0)) Me.menuMain.Visibility = Visibility.Visible
前3行代码,是为了获得控件A左下角的绝对坐标;原理是使用两个相对位置相减。注:btnTestMenu就是控件A。
第4行代码是将菜单放在指定位置上;
第5行代码是显示。
其它处理:在控件A的MouseLeave事件中要添加代码: Me.menuMain.Visibility = Visibility.Collapsed ;在菜单本身的MouseEnter事件中添加代码:Me.menuMain.Visibility = Visibility.Visible,在菜单MouseLeave事件中添加代码Me.menuMain.Visibility = Visibility.Collapsed 。
OK了,一般的菜单就可以了。
至于在某个容器中成为右键菜单,定位更加简单,可以参照以上实现。
感谢一些人共享了专业知识,使我接触到SL而不感到无助。