我有一个矩形。rectangle
有一个自定义contextmenu
(只是ControlTemplae
<ContextMenu.Template>
内的一些简单更改。我想要的是,左边单击鼠标,将弹出contextmenu
。
我尝试在矩形的rectangle1.contextmenu.isopen=true
事件中添加MouseDown
。是的,它会打开contextmenu
。但是,contextmenu
设置为在上方打开/弹出(在矩形的顶部,我只需将ContextMenuService.Placement="top"
添加到矩形的XAML中即可。但如果我在矩形的rectangle1.contextmenu.isopen=true
事件中使用MouseDown
,则弹出contextmenu
但是在错误的地方,它不再保持在顶部,而是跟随鼠标.Eg如果我点击矩形的右角,contextmenu
会在右边打开/弹出。这种行为很奇怪,我不知道为什么会这样。
无论如何,如何在鼠标左键单击矩形顶部打开contextmenu
?
更新
奇怪的是,无论我添加到任何mouseevent
的代码,上下文菜单都会丢失它的位置!例如,如果我在mouseDown事件上添加MsgBox("abc")
,然后右键单击矩形,则上下文菜单不在顶部!!
答案 0 :(得分:3)
正如我在MSDN参考ContextMenu.Placement
中看到的那样将ContextMenu分配给FrameworkElement.ContextMenu时 或FrameworkContentElement.ContextMenu属性, ContextMenuService在更改此属性的此值时 ContextMenu打开。如果用户使用打开ContextMenu 鼠标,Placement设置为MousePoint。如果用户打开了 ContextMenu通过使用键盘,Placement设置为Center。如果你 想要改变ContextMenu的位置,设置 FrameworkElement上的ContextMenuService.Placement属性 FrameworkContentElement上。
因此,由于您不是通过ContextMenuService执行此操作,因此您应自行更改Placement和PlacementTarget。
private void Mouse_Down(object sender, MouseButtonEventArgs e)
{
var cm = ContextMenuService.GetContextMenu(sender as DependencyObject);
if (cm==null)
{
return;
}
cm.Placement = PlacementMode.Top;
cm.PlacementTarget = sender as UIElement;
cm.IsOpen = true;
}
答案 1 :(得分:1)
我认为这就是你要去做的事情?
rect.ContextMenu.PlacementTarget = rect;
rect.ContextMenu.Placement = System.Windows.Controls.Primitives.PlacementMode.Top;
rect.ContextMenu.IsOpen = true;
// if you want it to be at the top and come down over the rectangle
rect.ContextMenu.VerticalOffset = rect.ContextMenu.ActualHeight;