鼠标左键单击 wpf c# 打开上下文菜单

2 c# wpf contextmenu

我有一个矩形。它rectangle有一个自定义(只是在其中contextmenu进行了一些简单的更改)。我想要的是,单击鼠标左键,将弹出。ControlTemplae<ContextMenu.Template>contextmenu

我尝试添加rectangle1.contextmenu.isopen=true矩形的事件。是的,它MouseDown会打开。但是,它被设置为在矩形的上方(顶部)打开/弹出,我通过简单地添加到矩形的 XAML 来做到这一点。但是如果我在矩形的事件,然后弹出,但在错误的位置,它不再停留在顶部,而是跟随鼠标。例如,如果我单击矩形的右角,则在右侧打开/弹出。这行为很奇怪,我不知道为什么会发生这种情况。contextmenucontextmenuContextMenuService.Placement="top"rectangle1.contextmenu.isopen=trueMouseDowncontextmenucontextmenu

无论如何,如何contextmenu通过单击鼠标左键打开矩形顶部的 ?

更新

奇怪的是,无论我向其中任何一个添加什么代码mouseevent,上下文菜单都会丢失它的位置!例如,如果我什至添加MsgBox("abc")mouseDown 事件,然后右键单击矩形,上下文菜单就不在顶部!

Rek*_*ino 5

正如我从 MSDN 参考ContextMenu.Placement中看到的

当 ContextMenu 分配给 FrameworkElement.ContextMenu 或 FrameworkContentElement.ContextMenu 属性时,ContextMenuService 在 ContextMenu 打开时更改此属性的值。如果用户使用鼠标打开 ContextMenu,则 Placement 将设置为 MousePoint。如果用户使用键盘打开 ContextMenu,则 Placement 将设置为 Center。如果要更改 ContextMenu 的位置,请设置 FrameworkElement 或 FrameworkContentElement 上的 ContextMenuService.Placement 属性。

因此,由于您不是通过 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;
}
Run Code Online (Sandbox Code Playgroud)