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

我尝试在矩形的rectangle1.contextmenu.isopen=true事件中添加MouseDown。是的,它打开了contextmenu。但是,contextmenu设置为在矩形的上方(顶部)打开/弹出,我只是简单地做到了在矩形的XAML中添加ContextMenuService.Placement="top"。但是,如果我在矩形的rectangle1.contextmenu.isopen=true事件中使用MouseDown,则会弹出contextmenu,但在错误的位置,它不再停留在顶部,而是紧随其后鼠标如果我单击矩形的右上角,contextmenu将在右侧打开/弹出。此行为非常奇怪,我不知道为什么会这样。

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

更新

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

最佳答案

从MSDN参考ContextMenu.Placement中可以看到


  将ContextMenu分配给FrameworkElement.ContextMenu时
  或FrameworkContentElement.ContextMenu属性,
  ContextMenuService在以下情况下更改此属性的此值:
  ContextMenu打开。如果用户使用以下命令打开ContextMenu
  鼠标,放置位置设置为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;
}

关于c# - 打开鼠标左键单击上下文菜单WPF C#,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48991392/

10-12 13:21