繁体   English   中英

打开鼠标左键单击上下文菜单WPF C#

[英]Open contextmenu on left mouse click wpf c#

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

我尝试添加rectangle1.contextmenu.isopen=true在矩形的MouseDown event.Yes,它打开contextmenu 。不过,该contextmenu设置为开/矩形上方弹出(顶部),我做到了通过简单地添加ContextMenuService.Placement="top"到矩形的XAML.But如果我使用rectangle1.contextmenu.isopen=true在矩形的MouseDown事件,然后将contextmenu弹出,但在错误的地方,它不会留在上面的任何更多,而它遵循mouse.Eg如果我点击矩形的右上角,在contextmenu打开在right.This行为/弹出很奇怪,我不知道为什么会这样。

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

更新

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

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

将ContextMenu分配给FrameworkElement.ContextMenu或FrameworkContentElement.ContextMenu属性时, 当ContextMenu打开时ContextMenuService会更改此属性的此值 如果用户使用鼠标打开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;
}

我想这就是你要做什么?

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM